Кэширование данных EAV - XML ​​или NoSQL / MongoDB?

Я создаю веб-приложение, которое в значительной степени полагается на шаблон 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 запись, поэтому я думаю, что это хороший кандидат для кеширования.

Пока что это варианты, которые я придумал ...

  1. Столбец базы данных XML: Каждый раз, когда выполняется запись, обновляйте текстовый столбец XML в таблице объектов содержащий все атрибуты объекта. Это сработает для быстрого чтения данных, но запрашивать данные XML, скрытые в таблице базы данных, беспорядочно.

  2. XML-файл: Каждый раз, когда выполняется запись, записывайте на диск XML-файл, содержащий каждый объект и его атрибуты. Это дает то преимущество, что затем я могу использовать XQuery для запроса объектов.

  3. NoSQL (например, MongoDB): Возможно, мне следовало построить систему на базе данных без схемы, такой как MongoDB.Переписывание всего приложения для использования MongoDB потребует много времени, но меня поразило, что я могу использовать его в качестве кеша. Так, например, каждый раз, когда данные записываются в хранилище EAV, эквивалентный объект будет обновляться в MongoDB, который затем будет использоваться для чтения и запросов.

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

Я хотел бы услышать ваше мнение по этому поводу.

7
задан Community 22 September 2017 в 18:01
поделиться