0

У меня есть база данных с десятками разных сущностей, и мне нужен гибкий способ представления ссылок между объектами без создания таблиц «много-ко-многим» N * M или добавления большого количества столбцов внешнего ключа для охвата всех возможных ссылочных объектов.EAV-подобный переменный внешний ключ ref_type/ref_id: плохой дизайн?

Один из вариантов, который я рассматривал, заключался в создании пары столбцов для представления ссылки, ref_type (string/varchar) и ref_id (int), и использовать их в EAV-стиле, чтобы указать на любой другой объект. Параметр ref_type будет содержать имя ссылочного объекта, а ref_id будет содержать идентификатор объекта (например, внешний ключ).

Например, если бы я имел таблицу для моего Foo сущности и хотел ссылаться на бар или БАЗ сущности, это может выглядеть следующим образом:

foo_id foo_name ref_type ref_id 
------ -------- -------- ------ 
1  aaa  bar  352 
2  bbb  baz  937 
3  ccc  bar  522 

Я знаю, что более традиционные способы достижения этой цели будет иметь bar_id и baz_id в качестве выделенных столбцов внешнего ключа в моей таблице foo или иметь выделенные таблицы foo_to_baz и foo_to_bar, которые могли бы представлять отношения. С двумя возможными объектами, на которые ссылаются, эти нормальные параметры не так уж плохи, но если у вас есть 20 или 200 возможных объектов, это кажется непрактичным.

Этот шаблон имеет определенное имя? Или это подпадает под Entity-Attribute-Value (EAV)?

Считается ли это «плохой» базой данных? Если да, есть ли лучшее решение, которое не требует большого количества столбцов внешнего ключа или таблиц X_to_Y?

+0

Если у вас есть 200 различных типов сущностей DB, вы либо НАСА, либо весь ваш дизайн неправильный, и эта небольшая деталь не имеет отношения к великой схеме вещей. –

ответ

4

В чем проблема, если вы решили решить проблему с EAV, у вас теперь есть две проблемы.