哪个数据库可以这样做?

时间:2014-03-22 22:30:02

标签: database sqlite database-design nosql relational-database

在最近的项目中,我需要一个执行此操作的数据库。

每个项都是键值对,每个键都是一个多维字符串,例如

第1项: 关键:['老师','教授'] 价值:'大卫'

第2项: 关键:['工作人员','讲师','教授'] 价值:'shawn'

所以每个键的长度不一定相同。我可以像

那样进行查询

任何以['老师','职员']为关键字的人。

此外,我可以稍后添加其他项目,例如,键值对,如。

第3项: 关键:['女性','教练','教授','程序员'] 价值:'annie'

所以我的想法是我可以将任何键数组标记为值,我可以按键的子集进行搜索。

2 个答案:

答案 0 :(得分:1)

由于(根据您的评论判断)您不需要强制执行唯一性,因此这些实际上并不是“密钥”,可以更恰当地将其视为“标记”,其主要目的是进行搜索(与StackOverflow不同) .com标签)。

在关系数据库中实现标记的典型方法如下所示:

enter image description here

请注意联结表TAG_ITEM主键中字段的顺序:由于我们的目标是查找给定标记的项目(不是给定项目的标记),因此索引的“前沿”在下面“ PK是TAG_ID。这有助于在给定的TAG_ID上进行有效的索引范围扫描。

Cluster TAG_ITEM,如果您的DBMS支持它。


然后,您可以搜索具有任意给定标记的项目,如下所示:

SELECT [DISTINCT] ITEM_ID
FROM
    TAG
    JOIN TAG_ITEM ON TAG.TAG_ID = TAG_ITEM.TAG_ID
WHERE
    TAG_NAME = 'teacher'
    OR TAG_NAME = 'professor'

如果您需要ITEM的任何其他字段,您可以:

SELECT * FROM ITEM WHERE ITEM_ID IN (<query above>)

您可以搜索具有所有的给定标记的项目,如下所示:

SELECT ITEM_ID
FROM
    TAG
    JOIN TAG_ITEM ON TAG.TAG_ID = TAG_ITEM.TAG_ID
WHERE
    TAG_NAME = 'teacher'
    OR TAG_NAME = 'professor'
GROUP BY
    ITEM_ID
HAVING
    COUNT(*) = 2

答案 1 :(得分:0)

PostgreSQL可以用它的hstore数据格式做类似的事情:http://www.postgresql.org/docs/9.1/static/hstore.html

或者您可能搜索数组?:http://postgresguide.com/sexy/arrays.html