SQL: один внешний ключ ссылается на первичный ключ в одной из нескольких таблиц

StackOverflow https://stackoverflow.com/questions/294969

Вопрос

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

Один из фундаментальных классов называется Node, а Nodes имеют Content. Таблицы SQL выглядят так:

Узел TABLE (NodeId int, .... и т. д.)

TABLE NodeContentRelationship (NodeId int, строка ContentType, ContentId int)

Это будет зависеть от разработчиков, расширяющих приложение для создания своих собственных типов контента.

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

Однако решение довольно простое и мощное, поэтому я не хочу его менять.

Что ты думаешь - я нахожусь в мире боли в будущем?

Это было полезно?

Решение

Почему невозможно установить NoteContentRelationship.ContentId в качестве внешнего ключа? Вы можете легко использовать модель реляционного наследования с таблицей Content , представляющей абстрактный базовый класс, и различными таблицами AnimalContent , CarContent и т. Д., Представляющими производные классы.

Другие советы

Остерегайтесь эффекта внутренней платформы .

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

Это выглядит как вариант дизайна EAV (Entity, Attribute, Value).

Преимущества и недостатки дизайна EAV подробно документированы.

Вот описание EAV с точки зрения сочувствия:

http://ycmi.med.yale.edu /nadkarni/Introduction%20to%20EAV%20systems.htm

А вот один из них с враждебной точки зрения:

http: // tonyandrews .blogspot.com / 2004/10 / otlt-и-EAV-два-большой дизайн-mistakes.html

Помните о недостатках EAV, прежде чем тратить тысячи человеко-часов на вливание в него данных. Это чрезвычайно соблазнительно для программистов, но может стать кошмаром для менеджера данных.

Если вам захочется отчитаться по этим данным, вас ждет мир страданий в будущем. Вы только сделали это намного труднее, чтобы писать соединения и тому подобное. Отсутствие ограничений - это плохо, но дополнительная работа, необходимая для запросов, (ИМХО) хуже.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top