Я создаю веб-приложение, которое в значительной степени полагается на шаблон 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 в таблице объектов содержащий все атрибуты объекта. Это сработает для быстрого чтения данных, но запрашивать данные XML, скрытые в таблице базы данных, беспорядочно.
XML-файл: Каждый раз, когда выполняется запись, записывайте на диск XML-файл, содержащий каждый объект и его атрибуты. Это дает то преимущество, что затем я могу использовать XQuery для запроса объектов.
NoSQL (например, MongoDB): Возможно, мне следовало построить систему на базе данных без схемы, такой как MongoDB.Переписывание всего приложения для использования MongoDB потребует много времени, но меня поразило, что я могу использовать его в качестве кеша. Так, например, каждый раз, когда данные записываются в хранилище EAV, эквивалентный объект будет обновляться в MongoDB, который затем будет использоваться для чтения и запросов.
Первоначально я думал, что XML-файл будет лучшим подходом, но я вижу, что файл становится действительно большим и неуправляемым. На данный момент я склоняюсь к использованию MongoDB. Я знаю, что запуск двух серверов баз данных для одного приложения кажется безумным, но я думаю, что в моем случае это может сработать.
Я хотел бы услышать ваше мнение по этому поводу.