Изменение внешних ключей в зависимости от поля - PullRequest
1 голос
/ 25 августа 2011

В SQL (в частности, mysql) рассмотрим случай, когда у меня есть таблица с перечислением (имя, отношение) с именем type и int с именем idtype.

Затем у меня есть другая таблица с именем names, имеющая полеidname и другая таблица, называемая отношениями с полем idrelation.

По существу, если type == name, тогда idtype является внешним ключом для idname, а если type = отношением, то idtype является внешним ключом для idrelation.Есть ли способ указать такое отношение внешнего ключа?Или / И есть ли лучший, более традиционный способ представить такие отношения в mysql?

Спасибо, Дэвид

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

Проблема в том, что вы храните два разных типа информации в одной таблице - почти всегда плохая идея (IMO).Вы должны разбить свой первый стол на две части.Другим вариантом является наличие двух полей nameID и typeID - но я бы не рекомендовал делать это таким образом.Без более подробной информации о ваших таблицах я не могу предложить более конкретный ответ.

1 голос
/ 25 августа 2011

Это звучит как дизайн, который никогда не будет хорошо работать на практике или при обычной пользовательской нагрузке.Вы действительно, действительно должны прочитать, почему таблицы EAV - очень плохой выбор дизайна.Гибкость EAV приобретается по очень высокой цене во время разработки для написания длинных, сложных, ужасных запросов и за счет сильно сниженной производительности.EAV следует использовать исключительно редко для очень нескольких настроек клиента.Но если вы правильно выполнили свою работу в дизайне, 95% или более должны быть смоделированы с помощью реляционной модели.

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

1 голос
/ 25 августа 2011

Я обычно моделирую это с помощью чего-то похожего на наследование в объектно-ориентированном языке. Это будет выглядеть примерно так:

Products
   id (PK)

Widgets
    product_id (FK to Products.id) (PK)
    <widget specific columns>

Whatsits
    product_id (FK to Products.id) (PK)

Product_Types
    type_id
    product_id (FK to Products.id)

Таким образом, вы можете связать типы продуктов с любым подтипом продукта.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...