Как реализовать множественные отношения в SQL Server? - PullRequest
3 голосов
/ 27 декабря 2010

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

Ответы [ 3 ]

7 голосов
/ 27 декабря 2010

Либо: одна таблица комментариев на тип сущности

Или: одна главная таблица сущностей с дочерними комментариями и определенными таблицами EntityType.

  • EntityMaster: EntityID, foo, bar
  • Комментарии: EntityID, CommentID, UserID, ... PK - это (EntityID, CommentID и т. Д.)

Для 3 таблиц Entity PK - это EntityID

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

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

Лично я бы, наверное, пошелдля варианта 1 ...

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

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

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

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

3 голосов
/ 27 декабря 2010

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

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

1 голос
/ 27 декабря 2010

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

alt text

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

Select * from Comment where CommentHistoryId = 5 -- '5' it CommentHistoryId from Entity1
...