1

我知道键值对不是好的数据库设计,没有规范化等,但是在这种情况下,我相信它们是最合适的解决方案。

我对此的借口和一些背景:大量项目被推入一组表中,并且每个项目都可以用用户可以选择的任意元数据进行标记。用户可以选择元数据,因为他们正在指定他们希望以后如何分类、报告和查看项目。对于这个特定的业务问题,我们(作为系统设计师)不应该说出这些维度是什么。跨项目使用的键集不一致,在某些情况下,某个键的存在将用作过滤条件。

另外一点背景信息,条目将被插入,但不会被更新。最终它们将被删除(按照插入的顺序依次)。

问题“高效存储”:我指的是查询(读取)性能。将使用以下类型的查询:

  • 获取具有给定键的项目,任何值
  • 获取具有给定键和值的项目
  • 获取所有键名的项目
  • 获取具有所有键名和值的项目

基本上,考虑到这些选项,哪个是最佳选择?:

选项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”开头的项目

如果我可以提供更多说明,请告诉我。

4

1 回答 1

3

你不需要借口来做一个糟糕的设计。您的设计是您的选择。但是要问什么是搞砸我的设计的最佳方法,并不是一个有很多答案也没有好的答案的问题。真正的问题是我应该使用什么其他存储技术来代替 RDBMS。

有些系统旨在存储键值数据,例如Cassandra。搜索 NoSQL... 找到适合的技术。

于 2011-02-08T15:44:55.907 回答