Как оптимальнее реализовать динамический набор атрибутов объекта с возможностью поиска по ним?

Собственно, вопрос: как оптимальнее реализовать динамический набор атрибутов объекта с возможностью поиска по ним?


Я уже некоторое количество времени разрабатывают решения на классических реляционных СУБД и думаю пока реляционным образом, хотя и стараюсь меняться.

Задача динамического набора атрибутов сама по себе довольно проста в рамках реляционной модели — таблица вроде


id объекта | id атрибута | значение


Но встаёт вопрос оптимальности структуры: допустим, максимальное значение текстового атрибута, по которому должна быть возможность искать, — varchar(255).

Однако, при этом в системе также могут существовать и целочисленные атрибуты и дробные и ещё бог знает какие.

При такой структуре таблицы придётся их всех вписывать в varchar(255), что, при большом количестве данных сильно увеличит объёме и замедлит поиск.


Можно попробовать пойти по пути экстенсивной оптимизации и создать две или больше таблиц для разных типов атрибутов, или, возможно, ввести вместо одного поля «значение» два: текстовое и числовое. Но мне как-то интуитивно не нравится это решение — придётся сильно усложнять логику формирования поисковых запросов.


Подскажите, пожалуйста, есть ли что почитать на эту тему интересного? Может, NoSQL-решения могут открыть новые способы решения проблемы?


UPD:

почитал про Mongo. Внешне там всё красиво — документ, у него произвольный набор атрибутов, можно строить индексы. Поверхностно задача решается просто. А внутри как? Насколько поиск по таким коллекциям будет выгоднее (по ресурсам), чем SQL-решение?
  • Вопрос задан
  • 3753 просмотра
Пригласить эксперта
Ответы на вопрос 4
TROODON
@TROODON
MongoDB хорош тем, что индексы у него уже отсортированы (а как отсортированы указываете при создании индекса)
P.S. как вариант посмотрите эти статьи, связанные с использованием поискового движка sphinx для поиска по значениям атрибутов:

Sphinx — не только для поиска!
Sphinx — не только для поиска! Моя история (Моя, в данном случае не означает моюисторию)
Ответ написан
Комментировать
DeusModus
@DeusModus
Есть такой шаблон — en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model. Успешно применяется в Magento и куче проектов поменьше. На первый взгляд именно то, что вам нужно.
Ответ написан
Комментировать
javax
@javax
Software Architect, Java Developer since 1996
key-value не даст возможности делать сортировку и групирование. Если Вам этого не нужно, только поикс — то можете использовать.
Ответ написан
Комментировать
@max_rip
Я над этим вопросом уже давно думал, и мне кажется что самым эффективным способом для обынчных бд типа mysql, будет отдельная таблица в которой будут добавляться поля вместе с атрибутами, если по ним нужен поиск. А если не нужен то можно как вы предложили.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы