Вам обязательно нужно выбрать вариант 2, потому что то, что вы пытаетесь моделировать, - это many to many relationship. (Многие владельцы могут относиться к чему-то. Многие вещи могут относиться к владельцу.) Обычно это делается с использованием того, что я называю bridging table. (Какой именно вариант 2). Это стандартная техника в нормализованной базе данных.
Другие два варианта помогут вам кошмары, пытающиеся запросить или поддерживать.
С опцией 1 вы должны присоединиться к User
таблицу в Thing
таблице на столбцов, чтобы получить все ваши результаты. И что происходит, когда у вас есть действительно популярная вещь, которую хотят 51 человек?
Вариант 3 еще хуже. Единственный способ легко запросить данные - использовать динамический sql или писать новый запрос каждый раз, потому что вы не знаете, к какой таблице Thing*Owners
присоединиться, пока не узнаете значение идентификатора той вещи, которую вы ищете. Или вам понадобится присоединиться к таблице User
к каждой таблице Thing*Owners
. Добавление новой вещи означает создание всей новой таблицы. Но, по крайней мере, вещь не имеет ограничения на количество владельцев, которые она могла бы иметь.
Сейчас не так:
SELECT Users.Name, Things.Name
FROM Users
INNER JOIN Ownership ON Users.UserId=Ownership.UserId
INNER JOIN Things ON Things.ThingId=Ownership.ThingId
гораздо проще, чем любой из этих других сценариев?
Вариант 2. Всегда. Каждый раз, когда у вас есть что-то другое, ударяйте себя.Лучше страдать от твоей собственной руки, чем от чужих. –
строго следуйте предложению Н.Б. ... –
Кстати, есть три примера выше, где у вас было что-то еще в виду. – Strawberry