2015-07-29 4 views
0

У меня есть таблица Things, и я хочу добавить отношения собственности к таблице Users. Мне нужно иметь возможность быстро запрашивать у владельцев вещь и вещи, которыми владеет пользователь. Если я знаю, что там будет не более 50 владельцев, и PDF для числа владельцев, вероятно, выглядеть this, я должен скорееМоделирование собственности в MySQL

  • добавить 50 столбцов в Things таблице, как CoOwner1Id, CoOwner2Id, ..., CoOwner50Id или
  • я должен моделировать это с Ownerships таблицу, которая имеет UserId и ThingId столбцов или
  • бы лучше создать таблицу для каждой вещи, например Thing8321Owners с рядом для каждого владельца или
  • Возможно, это сочетание?
+4

Вариант 2. Всегда. Каждый раз, когда у вас есть что-то другое, ударяйте себя.Лучше страдать от твоей собственной руки, чем от чужих. –

+0

строго следуйте предложению Н.Б. ... –

+0

Кстати, есть три примера выше, где у вас было что-то еще в виду. – Strawberry

ответ

1

Второй вариант правильный; вы должны создать промежуточную таблицу между таблицей Вещи и владельцем таблицы (которая содержит сведения о каждом владельце).
В этой таблице должны быть объекты thing_id и owner_id в качестве первичного ключа. Итак, наконец, вы также есть 3 таблицы:

  • вещей (вещи, детали и данные)
  • Владелец (владельцы детали и данные)
  • домовладений (присвоение каждому thing_id к owner_id)

Поскольку в реляционной БД вы не должны иметь избыточных данных.

1

Вам обязательно нужно выбрать вариант 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 

гораздо проще, чем любой из этих других сценариев?

Смежные вопросы