Записи с дополнительными свойствами: разреженная таблица или EAV? - PullRequest
2 голосов
/ 15 августа 2010

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

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

Пример:

WorkOrder:
PK id
FK assigned_to
FK contractor
DATE expected_completion
DATE actual_completion
... (many more)

Теперь я хочу добавить свойства, такие как:

ep_1 (extra_property)
ep_2
ep_3
ep_4
... (many more)

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

Думайте о записях как:

id  |  assigned_to  | contractor  | ... | ep_1   | ep_2  | ep_3 | ... | ep_n
1   |  2            | 3           | ... | XYZ    | NULL  | NULL | ... | 23
2   |  3            | 5           | ... | NULL   | 1     | NULL | ... | NULL
3   |  2            | 1           | ... | NULL   | 0     | NULL | ... | NULL
4   |  4            | 1           | ... | XYZ    | NUL   | NULL | ... | 45

Я хочу иметь возможность просматривать, фильтровать и искать записи, как если бы эти дополнительные свойства были фактически столбцами, например: я должен иметь возможность делать запросы, такие как SELECT fields FROM table WHERE ep_n > 20 и SELECT fields FROM table WHERE ep_1='ABC'

Какое лучшее решение для этого?

1 Ответ

3 голосов
/ 15 августа 2010

Какая база данных? Например, в SQL Server вы можете использовать Sparse Columns , оптимизированные для разреженных таблиц. Для моделирования EAV я рекомендую прочитать технический документ по этому вопросу от группы консультантов по работе с клиентами SQL Server: Рекомендации по моделированию семантических данных для производительности и масштабируемости . Многие рекомендации применимы и к другим поставщикам, не относятся к SQL Server.

...