2

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

Какой лучший подход? Мне не нравится шаблон 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) 

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

Think записей, как:

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'

Какое оптимальное решение?

+0

Не зная всех свойств, которые вы ожидаете встретить, сложно сделать предложения. –

+0

@OMG Это сделало бы вопрос слишком локализованным. Просто подумайте о них как о данных. Я должен иметь возможность делать запросы типа 'SELECT fields FROM table WHERE ep_n> 20' или' SELECT fields FROM table WHERE ep_1 = 'ABC'' – Aillyn

+2

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

ответ

3

В какой базе данных? Например, при использовании SQL Server вы можете использовать Sparse Columns, которые оптимизированы для разреженных таблиц. Для моделирования EAV я рекомендую прочитать техническую документацию по этому вопросу в команде советника клиента SQL Server: Best Practices for Semantic Data Modeling for Performance and Scalability. Многие из рекомендаций относятся и к другим поставщикам, не относятся к SQL Server.

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