我必须在SQLite数据库中保存很多(超过50 000行)document - key - value
。
我担心的是:这些值可以是文本的或数字的(有日期,字符串,数字等)。
我必须以两种方式请求我的基地:
我想到了两种可能的解决方案:
解决方案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)
我喜欢此解决方案:
我不喜欢这个解决方案:
问题
那么问题是你向我推荐哪种解决方案?为什么?你有其他解决方案吗?
答案 0 :(得分:0)
根据我的经验,将值存储为字符串是完全可以接受的,并且最简单/直接,只要......
- 您永远不必根据值本身进行搜索(无法使用索引)
- 您不会一次处理大量(数千/数百万)或记录
三个表和一个UNION
的选项有一个您可能没有发现的限制:UNIONed视图中的value
列不能是不同的数据类型。它们将被隐式转换(基于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)