Несколько атрибутов, которые нужно проиндексировать для неструктурированных объектов

Я задал подобный вопрос в контексте БД NOSQL по индексированию SO по нескольким полям в mongoDB, чтобы вскоре понять, что это не связано с какой-либо БД, а является общей проблемой проектирования. Я попытаюсь сформулировать запрос еще раз, чтобы он звучал обобщенно:

Мне нужно хранить информацию по объекту в какой-то БД. Каждый объект может иметь переменное количество атрибутов, каждое имя атрибута также может быть различным. Мы можем ограничить количество атрибутов до 10, если это облегчает нашу жизнь, может быть в мире реляционных БД.

Объект 1:

name : "Cupboard Number 1"
type: "Cupboard"
material : "Wood"
dimensions : "12X15"
built on : "2nd oct 2014"
id : 12212

Объект 2:

name : "Tommy"
type : "Pet"
owner : "Tom"
born : "1 June 2010"
id : 12321

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

Пример запроса может быть:

  • Поиск всех записей, которые имеют материал = "Дерево" и тип = "Таблица"
  • Поиск всех записей, которые имеют type = "Dog" и owner = "Harry"

Я думал об использовании таблицы / коллекции, где все атрибуты могут вписываться в один объект, но не вижу, как индексация будет возможна. Очевидно, я могу разбить объект на отдельные атрибутные объекты и затем сохранить его, что будет означать что-то вроде этого:

Объект 1 имеет несколько отдельных строк / объектов:

{ "attr_name" : "name", "attr_value" : "Cupboard Number 1", "id" : 12212 }
{ "attr_name" : "type", "attr_value" : "Cupboard", "id" : 12212 }
{ "attr_name" : "material", "attr_value" : "Wood", "id" : 12212 }
{ "attr_name" : "dimensions", "attr_value" : "12X15", "id" : 12212 }
{ "attr_name" : "built on", "attr_value" : "2nd oct 2014", "id" : 12212 }

Теперь я могу создать индекс для attr_name и получить 'id', который я могу использовать, чтобы собрать все записи для этого объекта. Однако это не будет работать сразу за одним атрибутом, в то время как мое требование состоит в том, чтобы фильтровать несколько атрибутов в одном запросе. Если бы мне пришлось заставить его работать за пределами одного атрибута фильтра, то мне нужно было бы выполнить несколько запросов для каждого атрибута фильтра, а затем объединить все результаты в "id". Не эффективно, как я это вижу.

Упростим предположить, что для любого объекта не будет более 10 атрибутов. Таким образом, мы потенциально можем иметь таблицу RDBMS, которая имеет один столбец на имя атрибута и один столбец для значения этого атрибута. Таким образом, мы можем иметь гигантскую схему таблиц, подобную этой:

attrName1 // attribute 1 Name
attrName2 // attribute 2 Name
...
attrVal1 // attribute 1 Value
attrVal2 // attribute 2 Value
..
id

Таким образом, Объект 1 потенциально может быть вставлен следующим образом:

('name', 'type', 'material', 'dimensions', 'built on', '','','','','','Cupboard Number 1','Cupboard','Wood','12X15','2ndOctober 2014',,,,,,12212)

Наличие отдельных индексов во всех столбцах 1-10 ускорит запрос (хотя он все равно будет выполнять объединения, что плохо). Это один из обходных путей для этой проблемы, но тогда нам нужно знать порядок, в котором атрибуты появляются в строке (материал находится в столбце 3 и т. Д.). Я ищу подход, который может решить эту проблему более элегантно. Любая БД в порядке, и дайте мне знать, если есть ссылки на блоги, которые пытались решить что-то вроде этого.

0 ответов

Другие вопросы по тегам