2014-09-21 4 views
0

У меня есть одна таблица с изображениями, которые мне нужно связать с 6 другими таблицами. Предположим, что эти таблицы - это пользователи, таблицы, продукты, рестораны, категории и корабли.Соединительная таблица, соединяющая несколько таблиц

Должен ли я создать 6 разных таблиц соединения, чтобы каждая таблица имела свой собственный соединительный стол - Images_Users, Images_Tables, Images_Restaurants и т. Д.?

Или лучше создать одну таблицу с полем, чтобы отличить, где он связывает - Images_Entity с Поля- Id, image_id, ENTITY_ID, ENTITY_TYPE (я использую это, чтобы отличить ли его пользовательской таблицы, продукты питания, или любой другой) , Мне не нравится это решение, так как в этом случае мне не хватает ограничений FK, но я склоняюсь к тому, что проект уже будет иметь большое количество таблиц.

Возможно, существует третий подход? Создать 6 таблиц изображений? Какое решение лучше всего подходит для работы?

EDIT * База данных будет использоваться для отображения данных, вставки, обновления производительности не является проблемой, только выберите утверждения. Я просто понял, что никакое изображение не может ссылаться на две записи (это делает избыточные таблицы соединений).

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

Таблица изображений должна содержать FK и может ссылаться только на одну из шести таблиц, а не на две одновременно.

+1

Решение основано на том, как данные будут использоваться. Вы не указываете, как будет использоваться база данных, поэтому для информированного ответа очень мало информации. –

+0

Добавлено описание. –

+0

От одного до многих в каком направлении? Может ли в одном ресторане много изображений или может быть один образ во многих ресторанах? – GolezTrol

ответ

1

Вы можете использовать эксклюзивные FKS или наследство, как описано в this post.

Если вы выберете первое, чек используется для эксклюзивных FKS нужно будет использовать немного другой синтаксис (от того, что был использован в ссылке), чтобы быть практичным:

enter image description here

CHECK (
    (
     CASE WHEN UserID   IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN TableID  IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN FoodID  IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN RestaurantID IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN CategoryID IS NULL THEN 0 ELSE 1 END 
     + CASE WHEN ShipID  IS NULL THEN 0 ELSE 1 END 
    ) 
    = 1 
) 

CHECK выше гарантирует, что только один из FK не является NULL в любой момент времени.

Кстати, ваши подозрения относительно «динамического» FK (с полем «тип») были correct.

2

Один из возможных подходов заключается в добавлении UserId, RestaurantId, TableId, FoodId и т.д. в Images таблице.

Таким образом, вы можете добавить правильный FK для каждого из этих столбцов. Используя ограничение или триггер (в зависимости от СУБД), вы можете обеспечить, чтобы одно из этих полей было равно not null. Фактическая проверка того, что заполненный идентификатор обрабатывается ограничениями FK.

Таким образом, достаточно легко определить все правила, которые вы хотите иметь.

С отдельными соединительными столами это сложнее управлять. Когда вы вставляете строку соединения для Table_Image, вы должны проверить, нет ли такой записи для каких-либо других объектов в других таблицах соединений.

Смежные вопросы