存储数据和按元数据搜索?

时间:2009-08-03 02:08:18

标签: python metadata

假设我有一组数据,其中每一行都是一对坐标:(X,Y)。与每个点相关联,我有任意元数据,例如{color: yellow}{age: 2 years}

我希望能够以这样的方式存储数据和元数据,以便我可以查询元数据(例如:[rows where {age: 2 years, color: yellow}]),然后接收所有匹配的坐标行。

没有预定义的元数据列或值,所有坐标行也不一定具有相同的元数据列。存储此数据以获得最快访问权限的最佳方法是什么?是否有可能使用东京内阁(没有东京暴君)或SQLite等东西,还是有更好的选择?

3 个答案:

答案 0 :(得分:2)

任何关系数据库都应该能够处理这样的事情(你基本上只是在几个表之间进行连接,一个用于数据,一个用于元数据)。 SQLite应该可以正常工作。

您的第一个表将拥有数据本身,每个条目都有唯一的ID。然后你的第二个表将有3个工作列:元数据键,元数据值和相关的条目ID。

示例数据表:

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 :(得分:1)

使用@Dav的架构,获取“[所有坐标行,其中年龄= 2且颜色=蓝色]”的方法是(假设(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

答案 2 :(得分:0)

由于列既不是预定义的,也不是所有行的一致性 使用bigtable类型实现,例如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%"