我知道键值对不是好的数据库设计,没有规范化等,但是在这种情况下,我相信它们是最合适的解决方案。
我对此的借口和一些背景:大量项目被推入一组表中,并且每个项目都可以用用户可以选择的任意元数据进行标记。用户可以选择元数据,因为他们正在指定他们希望以后如何分类、报告和查看项目。对于这个特定的业务问题,我们(作为系统设计师)不应该说出这些维度是什么。跨项目使用的键集不一致,在某些情况下,某个键的存在将用作过滤条件。
另外一点背景信息,条目将被插入,但不会被更新。最终它们将被删除(按照插入的顺序依次)。
问题“高效存储”:我指的是查询(读取)性能。将使用以下类型的查询:
- 获取具有给定键的项目,任何值
- 获取具有给定键和值的项目
- 获取所有键名的项目
- 获取具有所有键名和值的项目
基本上,考虑到这些选项,哪个是最佳选择?:
选项1
Items table:
item_id (integer, pk)
... item fields ...
ItemFacts table:
item_id (integer, fk)
key_name (nvarchar(64))
key_value (nvarchar(128))
选项 2
Items table:
item_id (integer, pk)
... item fields ...
Facts table:
fact_id (integer, pk)
key_name (nvarchar(64))
key_value (nvarchar(128))
ItemFacts table:
item_id (integer, fk)
fact_id (integer, fk)
(可能还有第三种选择,将键名再次提取到单独的表中以减少冗余,因为给定键名可能存在大量已使用/可能的值,也可能值得考虑)
粗略地说,会有大量重复的键/值匹配。因此,应该提高存储效率。我意识到这是一个开放式问题,但是读取性能呢?如果我也引入这个查询怎么样:?
- 获取给定键的值以“x”开头的项目
如果我可以提供更多说明,请告诉我。