Чтобы дать представление о том, что я говорю, рассмотрим сущность (в моем случае это Task
), которая может быть связана с любым количеством других объектов в системе. Для наших целей, скажем, задача может быть связана с:База данных SQL Server - Как обрабатывать таблицу, которая МОЖЕТ быть связана с любым количеством других таблиц?
- Проект
- Счет
- билетов
- Человек
- т.д.
Все они представлены со своими таблицами в базе данных. Теперь задача потенциально может быть связана с любым из них, и из-за того, что система находится в активной разработке, список потенциальных связей будет продолжать расти относительно быстро. Обратите внимание, что это отношения от 1 до многих - задача может быть связана только с одной из них за один раз, но у одной учетной записи может быть связано несколько задач.
Теперь я рассмотрел несколько вариантов этого, однако я не считаю себя экспертом в области проектирования баз данных, поэтому я решил, что дойду до конца. Опции я Рассмотренный таким образом далеко включают в себя:
внешний ключ для каждого звена в
Task
таблицы, и мы просто должны продолжать добавлять столбцы. Однако, поскольку задача не может быть связана с более чем одним из них за раз, это приведет к большому количеству столбцов FK с значениями NULL. Это также потребует нового столбца и обновления нашей модели базы данных в нашем приложении всякий раз, когда мы добавляем новую ссылку.Один столбца в
Task
который выступает в качестве внешнего ключа, но включает в себя еще один столбец с указанием ссылкиtype
, поэтому при запросе от него мы можем определить, какие JOIN и произойдут в зависимости от типа. Таким образом, оба идентификатора учетной записи и лица будут в этом столбце для своих задач, но столбец типа ссылки указывает, является ли идентификатор человеком или учетной записью. Это очень рискованно для меня, и, очевидно, ограничения не могут быть соблюдены в базе данных.Другие варианты ??
Я хотел бы, если кто-то смог бы указать меня в направлении «чистого» дизайн, но если нет, то многочисленные колонны действуют как ограничения FK, но позволяя NULL быть лучшей?
Заранее благодарен!
Я столкнулся с аналогичным вызовом несколько лет назад. Не задумываясь, я выбрал второй вариант. Вместо использования object_id в sys.object я создал новую таблицу, которая содержит константу, которая обозначает ту таблицу. Я где-то слышал, что этот дизайн плох, но я никогда не слышал, почему. Пять лет спустя этот тип ссылок использовался практически повсеместно в приложении (комментарии, документы, параметр и т. Д.). В некотором роде он стал ядром приложения. В то время я этого не ожидал, но мне стало интересно узнать, как развилось. – AXMIM
Следуя моему предыдущему комментарию, так как я больше не работаю там, поэтому я не могу сказать, что они теперь наносят урон негативному эффекту. Он прочно удерживается в течение 5 лет. Тем не менее, я должен признать, что я видел, что SQL-сервер делает какой-то странный план запроса один или два из-за этого, и здесь есть некоторые небольшие недостатки. Кроме того, сущность-структура не была вокруг. Я не уверен, что буду доверять EF для обработки этих объединений. – AXMIM
Это новый экземпляр вопроса о повторяющихся * полиморфных ассоциациях *. Как только вы знаете официальный термин, легко найти способы, как это сделать. –