Хранение данных и поиск по метаданным? - PullRequest
0 голосов
/ 03 августа 2009

Допустим, у меня есть набор данных, где каждая строка представляет собой пару координат: (X, Y). С каждой точкой связаны произвольные метаданные, например {color: yellow} или {age: 2 years}.

Я хотел бы иметь возможность хранить данные и метаданные таким образом, чтобы я мог запросить метаданные (например, [rows where {age: 2 years, color: yellow}]) и в ответ получить все соответствующие строки координат.

Нет предопределенных столбцов или значений метаданных, и при этом все строки координат не обязательно будут иметь одинаковые столбцы метаданных. Как лучше всего хранить эти данные для быстрого доступа? Возможно ли будет использовать что-то вроде кабинета Токио (без Токийского тирана) или SQLite, или есть лучший вариант?

Ответы [ 3 ]

2 голосов
/ 03 августа 2009

Любая реляционная база данных должна иметь возможность обрабатывать что-то подобное (в основном вы просто объединяете пару таблиц, одну для данных и одну для метаданных). SQLite должен работать нормально.

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

Пример таблицы данных:

ID  Data
--------
1   (1,1)
2   (7,4)
3   (2,3)

Пример таблицы метаданных:

ID     Key         Value
--------------------------
1      "color"     yellow
1      "age"       3
2      "color"     "blue"
2      "age"       2
3      "color"     "blue"
3      "age"       4
3      "loc"       "usa"

Тогда, если вы хотите найти все точки данных с возрастом не менее 3 лет, вы должны использовать запрос, подобный следующему:

SELECT * from datatable WHERE datatable.ID = metadatatable.ID AND metadatatable.Key="age" AND metadatatable.Value >= 3
1 голос
/ 03 августа 2009

Используя схему @ Dav, способ получить «[все строки координат, где age = 2 и color = blue]» есть (при условии, что (ID, Key, Value) уникален в метаданных, т. Е. Последний не имеет полностью дубликат строки):

SELECT datatable.Data 
  FROM datatable
  JOIN metatadatable AS m USING(ID)
  WHERE (m.Key="age" AND m.Value=2)
     OR (m.Key="color" AND m.Value="blue")
  GROUP BY datatable.ID, datatable.Data
  HAVING COUNT()=2
0 голосов
/ 03 августа 2009

Поскольку столбцы не являются ни предопределенными, ни согласованными во всех строках, вам нужно либо перейти с реализациями больших таблиц, такими как google appengine (exapndo models w / listproperty) или cassandra / hbase и т. д. (см. http://en.wikipedia.org/wiki/BigTable)

Для простых реализаций, использующих sqlite, вы можете создать строковое поле в формате

f1  | f2  | metadata as string
x1  | y1  | cola:val-a1 colb:val-b1 colc:val-c1
x2  | y2  | cola:val-a2 colx:val-x2

and use SELECT * from table WHERE metadata like "%cola:val-a2%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...