在最近的项目中,我需要一个执行此操作的数据库。
每个项都是键值对,每个键都是一个多维字符串,例如
第1项: 关键:['老师','教授'] 价值:'大卫'
第2项: 关键:['工作人员','讲师','教授'] 价值:'shawn'
所以每个键的长度不一定相同。我可以像
那样进行查询任何以['老师','职员']为关键字的人。
此外,我可以稍后添加其他项目,例如,键值对,如。
第3项: 关键:['女性','教练','教授','程序员'] 价值:'annie'
所以我的想法是我可以将任何键数组标记为值,我可以按键的子集进行搜索。
答案 0 :(得分:1)
由于(根据您的评论判断)您不需要强制执行唯一性,因此这些实际上并不是“密钥”,可以更恰当地将其视为“标记”,其主要目的是进行搜索(与StackOverflow不同) .com标签)。
在关系数据库中实现标记的典型方法如下所示:
请注意联结表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