假设我有一组数据,其中每一行都是一对坐标:(X,Y)。与每个点相关联,我有任意元数据,例如{color: yellow}
或{age: 2 years}
。
我希望能够以这样的方式存储数据和元数据,以便我可以查询元数据(例如:[rows where {age: 2 years, color: yellow}]
),然后接收所有匹配的坐标行。
没有预定义的元数据列或值,所有坐标行也不一定具有相同的元数据列。存储此数据以获得最快访问权限的最佳方法是什么?是否有可能使用东京内阁(没有东京暴君)或SQLite等东西,还是有更好的选择?
答案 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%"