2013-12-17 1 views
0

Допустим, у меня есть 3 модели:Что должен отношения таблицы выглядеть - нужно подтверждение моей техники

  • пользователя
  • Page
  • Комментарии

я задал вопрос, основанный на если я буду иметь в каждой модели отслеживать ее отношения: SQL relationships and best practices

пример thi s будет таблицей «Страницы», в которой указывается, кто был ее автором ... Проблема заключалась в том, что если бы 2 пользователя были автором одной страницы, вам нужно было бы добавить новую определенную таблицу под названием PageRelationshipsWithUsers, которая может иметь ссылку на идентификатор страницы и идентификатор пользователя, который создал его, и отдельную строку для соавтора.

Понятно, что это звучит немного невзрачно. Я бы в конечном итоге столкнулся с нагрузкой таблиц отношений и, скорее всего, его можно было заменить только одной многоцелевой таблицей отношений ... Поэтому я решил составить таблицу соотношений следующим образом:

отношения Таблица Новый

RelationshipID | ItemID  | LinkID  | ItemType | LinkType | Status 
----------------------------------------------------------------------------- 
1    | 23(PageID) | 7(UserID) | ("Page") | ("User") | TRUE 
2    | 22(CommentID) | 7(UserID) | ("Comment") | ("User") | TRUE 
3    | 22(CommentID) | 23(PageID) | ("Comment") | ("Page") | TRUE 

однако, я бы очень признателен некоторые материалы о том, как хорошо идеи выложив мою таблицу отношений, как это.

Любые мысли?

Ответ сказали мне коллега по работе:

Представьте таблицу выше соотношения для модели «Книга»

пользователь может взять напрокат книгу, так что отношение пользователя -> Книга ... Но что, если он может купить книгу тоже: User-> Book ....

Ooops, нам нужны новые отношения ... и учитывая, что эта таблица отношений должна была быть 1 размер подходит всем , теперь у нас есть требование добавить новую отдельную таблицу ... whoops.

Таким образом, ответ НЕТ НЕТ НЕТ. нет, это озорной. Держите свои таблицы отношений отдельными и конкретными.

+0

Если какой-либо из ваших «типов» повторяется, они должны быть в их собственных таблицах. – Kermit

+0

Я не уверен, что понимаю, что вы сказали. Вы имеете в виду, что если есть 2 типа страницы. один с титром и один с AwesomeTitle ... это редкий случай ... я не прав? – Jimmyt1988

+0

Если вы хотите попасть в [3NF] (http://en.wikipedia.org/wiki/Third_normal_form), то повторяющиеся данные, которые у вас есть под типами, должны иметь свои собственные таблицы, а затем ссылаться в таблице ваших отношений. – Kermit

ответ

2

Ваше предложение для таблицы отношений не является оптимальным по нескольким причинам:

  • Это трудно писать запросы, которые соединяют таблицы через таблицу отношения, как вы будете нуждаться фильтры на ItemType и LinkType колонны, которая не интуитивно понятный при написании запросов.
  • Если возникает необходимость добавления новых объектов в будущем, которые используют разные типы данных для своих первичных ключей, вы не можете легко хранить идентификаторы различных типов данных в столбцах ItemID и LinkID.
  • Вы не можете создавать явные внешние ключи в своей базе данных, чтобы обеспечить ссылочную целостность, что, возможно, является лучшей причиной, чтобы избежать дизайна, который вы предлагаете.
  • Ошибка выполнения запроса.

При нормализации базы данных вы не должны бояться иметь много таблиц. Просто убедитесь, что вы используете соглашение об именах, которое имеет смысл и самодокументируется. Например, вы можете назвать таблицу отношений между авторами и страницами «PageAuthors», а не «Страницы».

+0

Хотя я не согласен с некоторыми вашими соображениями, подумав об этом некоторое время, я полностью согласен с использованием таблиц case case для отношений. Всем спасибо. – Jimmyt1988

+0

Существует ли обычное соглашение об именах для таблицы отношений в SQL .. например, у меня будет страница, которая должна быть создана многими пользователями, поэтому я собираюсь создать таблицу для «PageToUserRelations» ... а не это относительно уродливое name, существует ли обычное соглашение об именах для такого отношения? – Jimmyt1988

+0

http://stackoverflow.com/questions/631850/how-do-you-name-your-many-to-many-relationship-tables dw! – Jimmyt1988

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