Я создаю веб-приложение, которое в значительной степени зависит от EAV. шаблон для хранения данных. В основном это означает, что каждый атрибут объекта имеет свою собственную строку в массивной таблице базы данных. Я использую MySQL для хранения всего. Это очень упрощенный пример того, что я храню...
OBJECTS ATTRIBUTES
objId | type objId | attribute | value
============= =========================
1 | fruit 1 | color | green
2 | fruit 1 | shape | round
3 | book 2 | color | red
Я знаю, что некоторые люди ненавидят EAV, но мне нужно иметь возможность произвольно добавлять новые атрибуты объекта, не изменяя схему базы данных, и до сих пор у меня это работало очень хорошо.
Как я думаю, кто-нибудь еще обнаружит при построении системы с использованием структуры данных EAV, слабость этого подхода заключается в извлечении нескольких объектов вместе с атрибутами каждого объекта. На данный момент мое приложение отображает только 10 объектов за раз, поэтому я просто запрашиваю свою таблицу EAV 10 раз (один раз для каждого объекта), и это все еще очень быстро. Однако я хотел бы снять это ограничение и разрешить извлечение сотен объектов за один раз. Я также хочу иметь возможность запрашивать объекты более гибким способом, чем сейчас.
Делать это с помощью соединений SQL было бы отвратительно, поэтому я рассматриваю возможность кэширования данных. В среднем база данных получает около 300 чтений на каждую 1 запись, поэтому я думаю, что это хороший кандидат для кэширования.
Пока такие варианты я придумал...
Столбец базы данных XML: каждый раз при выполнении записи обновляйте текстовый столбец XML в таблице objects, содержащий все атрибуты объекта. Это будет работать для быстрого чтения данных, но запрос XML-данных, скрытых в таблице базы данных, запутан.
Файл XML: каждый раз, когда выполняется запись, записывайте файл XML на диск, который содержит каждый объект и его атрибуты. Преимущество этого заключается в том, что я могу затем использовать XQuery для запроса объектов.
NoSQL (например, MongoDB): Возможно, мне следовало построить систему на бессхемной базе данных, такой как MongoDB. Переписывание всего приложения для использования MongoDB заняло бы довольно много времени, но меня осенило, что я могу использовать его в качестве кэша. Так, например, каждый раз, когда данные записываются в хранилище EAV, эквивалентный объект будет обновляться в MongoDB, который затем будет использоваться для чтения и запросов.
Первоначально я думал, что файл XML будет лучшим подходом, но я вижу, что файл становится действительно большим и неуправляемым. На данный момент я склоняюсь к использованию MongoDB. Я знаю, что использование двух серверов баз данных для одного приложения кажется безумием, но я думаю, что это может сработать в моем случае.
Я хотел бы услышать ваши мысли по этому поводу.