Как реализовать множественные отношения в SQL Server?

Я пытаюсь создать базу данных для использования с приложением ASP.net MVC. Вот сценарий: есть три объекта, и пользователи могут публиковать свои комментарии для каждого из этих разных объектов. Мне просто интересно, как просто поставить одну таблицу для комментариев и связать с ней все остальные сущности. Очевидно, что для таблицы комментариев требуется 3 ссылки (внешний ключ) на эти таблицы, но, как вы знаете, эти внешние ключи не могут быть нулевыми, и только одна из них может быть заполнена для каждой строки. Есть ли лучший способ, чем реализовать три разные таблицы для комментариев каждой сущности?


person Ehsan Tavakoli    schedule 27.12.2010    source источник


Ответы (3)


Либо: одна таблица комментариев для каждого типа объекта

Или: одна основная таблица Entity с дочерними таблицами Comment и EntityType.

  • EntityMaster: EntityID, foo, бар
  • Комментарии: EntityID, CommentID, UserID, ... PK (EntityID, CommentID и т. д.)

Для 3 таблиц сущностей PK — это EntityID.

  • EntityOne: EntityID, EntityTypeID (проверить ограничение = 1),...
  • EntityTwo: EntityID, EntityTypeID (проверьте ограничение = 2),...
  • EntityThree: EntityID, EntityTypeID (проверьте ограничение = 3),...

В наличии одной таблицы комментариев для 3 родителей нет никакого упрощения или элегантности: это неправильно с точки зрения проектирования базы данных.

Лично я бы выбрал вариант 1...

Изменить, поразмыслив:

Иногда нужно смотреть на использование данных.

Если 3 объекта используются отдельно, на разных экранах, не связываются друг с другом, тогда это будет вариант 1.

Если 3 объекта используются и отображаются вместе, то вариант 2 имеет больше смысла, так как вам будет проще собирать данные вместе.

person gbn    schedule 27.12.2010
comment
+1 За указание на то, как можно смоделировать распределенные ключи с проверочными ограничениями. Однако я бы сказал, что бывают случаи (не здесь), когда последний подход приемлем. - person ; 27.12.2010

Если вы соедините все три таблицы сущностей с одной и той же таблицей комментариев, вы не сможете обеспечить ссылочную целостность через внешние ключи. В этом сценарии у вас будет один «ключевой» столбец и один столбец «тип объекта» в вашей таблице комментариев. Чтобы получить комментарии для определенного объекта, вам необходимо отфильтровать его по типу объекта.

Лично я бы предпочел три таблицы комментариев с одинаковой структурой, которые можно объединить с помощью объединения, чтобы получить все комментарии для всех сущностей.

person froeschli    schedule 27.12.2010
comment
Я согласен с несколькими таблицами комментариев с одинаковым предложением структуры. - пока столбцы непротиворечивы, должно быть легко объединить комментарии в представление. - person Nikhil; 27.12.2010

Ваша структура БД, как на изображении ниже. Вам нужно создать CommentHistory при создании Entity1 или Entity2.

альтернативный текст

Итак, если вам нужно получить все комментарии для Entity1, вам просто нужно:

Select * from Comment where CommentHistoryId = 5 -- '5' it CommentHistoryId from Entity1
person Andrew Orsich    schedule 27.12.2010