Как оптимальнее реализовать динамический набор атрибутов объекта с возможностью поиска по ним?
Собственно, вопрос: как оптимальнее реализовать динамический набор атрибутов объекта с возможностью поиска по ним?
Я уже некоторое количество времени разрабатывают решения на классических реляционных СУБД и думаю пока реляционным образом, хотя и стараюсь меняться.
Задача динамического набора атрибутов сама по себе довольно проста в рамках реляционной модели — таблица вроде
id объекта | id атрибута | значение
Но встаёт вопрос оптимальности структуры: допустим, максимальное значение текстового атрибута, по которому должна быть возможность искать, — varchar(255).
Однако, при этом в системе также могут существовать и целочисленные атрибуты и дробные и ещё бог знает какие.
При такой структуре таблицы придётся их всех вписывать в varchar(255), что, при большом количестве данных сильно увеличит объёме и замедлит поиск.
Можно попробовать пойти по пути экстенсивной оптимизации и создать две или больше таблиц для разных типов атрибутов, или, возможно, ввести вместо одного поля «значение» два: текстовое и числовое. Но мне как-то интуитивно не нравится это решение — придётся сильно усложнять логику формирования поисковых запросов.
Подскажите, пожалуйста, есть ли что почитать на эту тему интересного? Может, NoSQL-решения могут открыть новые способы решения проблемы?
UPD:
почитал про Mongo. Внешне там всё красиво — документ, у него произвольный набор атрибутов, можно строить индексы. Поверхностно задача решается просто. А внутри как? Насколько поиск по таким коллекциям будет выгоднее (по ресурсам), чем SQL-решение?
MongoDB хорош тем, что индексы у него уже отсортированы (а как отсортированы указываете при создании индекса)
P.S. как вариант посмотрите эти статьи, связанные с использованием поискового движка sphinx для поиска по значениям атрибутов:
Я над этим вопросом уже давно думал, и мне кажется что самым эффективным способом для обынчных бд типа mysql, будет отдельная таблица в которой будут добавляться поля вместе с атрибутами, если по ним нужен поиск. А если не нужен то можно как вы предложили.