Я поддерживаю 10-летнюю систему, которая имеет центральную модель EAV с 10M + сущностями, 500M + значениями и сотнями атрибутов.Некоторые соображения по проектированию из моего опыта:
Если у вас есть какая-либо бизнес-логика, которая относится к определенному атрибуту, стоит иметь этот атрибут в качестве явного столбца.Атрибуты EAV должны быть действительно универсальными, приложение не должно отличать атрибут A от атрибута B. Если вы обнаружите в коде буквальную ссылку на атрибут EAV, вероятно, это будет явный столбец.
Наличие значительного количества пустых столбцов не является большой технической проблемой.Требуются хорошие методы кодирования и документирования, чтобы объединить различные проблемы, которые в итоге приводятся в одной таблице:
- Имеются соглашения и правила, которые позволяют вам знать, какая часть вашего приложения считывает и изменяет какую часть данных.
- Использование представлений для облегчения работы с базой данных с помощью инструментов отладки.
- Создание и поддержка генераторов тестовых данных, чтобы вы могли легко создавать фиктивные фиктивные данные, соответствующие схеме, для частей модели, которые в данный момент не используются.Заинтересованы в.
- Используйте строгие версии базы данных.Единственный способ внести изменения в схему должен быть через инструмент, который отслеживает и применяет сценарии изменений.Postgresql имеет транзакционный DDL, который является одной из самых гибких функций для автоматизации изменений схемы.
Postgresql на самом деле не любит узкие таблицы.Каждое значение атрибута приводит к 32 байтам хранения данных в дополнение к дополнительной работе по обходу всех строк для объединения данных.Если вы в основном читаете и записываете атрибуты как пакет, рассмотрите возможность сериализации данных в строку каким-либо образом.attr_ids int[], attr_values text[]
- это один вариант, hstore - другой, или что-то на стороне клиента, например, json или protobuf, если вам не нужно прикасаться к чему-то конкретному на стороне базы данных.
Не уходите с дорогиположить все в одну таблицу сущностей.Если они не имеют общих атрибутов разумным образом, используйте несколько мгновений определенного шаблона EAV, который вы используете.Но постарайтесь использовать один и тот же шаблон и делиться любым кодом доступа между различными учреждениями.Вы всегда можете параметризовать код в имени объекта.
Всегда имейте в виду, что код - это данные, а данные - это код.Вам нужно найти правильный баланс между внедрением решений в метамодель и выражением их в виде кода.Если вы заставите метамодель делать слишком много, его модификация потребует такой же способности понимать систему, инструменты управления версиями, процедуры QA, постановку, как ваш код, но у нее не будет ни одного из инструментов.По сути, вы будете заниматься программированием на очень неуклюжем нестандартном языке.С другой стороны, если вы оставите слишком много в коде, каждое тривиальное изменение будет нуждаться в новой версии вашего программного обеспечения.Люди склонны ошибаться, делая метамодель слишком сложной.Создание инструментов разработчика для метамоделей - трудоемкая и утомительная работа, имеющая ограниченную выгоду.С другой стороны, удешевление процесса выпуска за счет автоматизации всего, что происходит от фиксации до развертывания, имеет много побочных преимуществ.