2

document - key - value我必须在 SQLite 数据库中保存很多(超过 50 000 行) 。我担心的是:这些值可以是文本的或数字的(有日期、字符串、数字等)。我必须以两种方式请求我的基地:

  • 文档的所有值####
  • 或使用比较运算符

我想到了两种可能的解决方案:

解决方案1:
单个表:
key(text) | type(one of text/date/float) | value(text)

并在我需要比较时使用显式转换(例如,
SELECT * FROM mytable WHERE (CAST(value as float) < "2010-01-01 00:00:00") AND (type='date')

SELECT * FROM mytable WHERE (CAST(value as float) < 17.5) AND (type='float')

我喜欢这个解决方案

  • 很容易获得所有值

我不喜欢这个解决方案

  • 我必须制作很多(可能)昂贵的演员表

解决方案2:
三个表:

  • 文本值:key(text) | value(text)
  • 浮动值:key(text) | value(float)
  • 日期值:key(text) | value(datetime)

我喜欢这个解决方案

  • 没有更多的演员表

我不喜欢这个解决方案

  • 获取所有值的成本为 3 次选择和一个联合
  • 我觉得这不太优雅

那么问题
来了,您向我推荐了哪些解决方案?为什么?您还有其他解决方案要提出吗?

4

1 回答 1

0

根据我的经验,将值存储为字符串是完全可以接受的,并且是最简单/直接的,前提是......
- 您永远不必根据值本身进行搜索(无法使用索引)
- 您不需要处理大量(千/百万)或一次记录


三个表和一个选项UNION有一个您可能没有发现的限制:valueUNIONed 视图中的列不能是不同的数据类型。它们要么被隐式转换(基于 UNION 的第一个 SELECT 中的字段类型),要么视图将无法创建。

我对这个想法的改变是用三个值字段代替一个。然后,您可以为每个添加单独的索引,只有一个表,避免需要 CAST 和其他各种好处。所有这些都以表中的一些额外复杂性为代价(我更喜欢这里而不是使用它的查询),但也大大增加了使用的空间。

Key, Type, Value_INT, Value_FLOAT, Value_DATE


编辑:

哦,还有最后一个选择。不要将值存储为字符串,而是将它们存储为浮点数。您提到的所有三种数据类型都可以存储为浮点数,从而允许使用索引。

SELECT * FROM mytable WHERE (type='date') AND (value < CAST("2010-01-01 00:00:00" AS FLOAT))

或者

SELECT * FROM mytable WHERE (type='float') AND (value < 17.5)

或者

SELECT * FROM mytable WHERE (type='int') AND (value < 17)

于 2011-05-06T13:54:15.683 回答