2011-05-06 30 views
2

我必须在SQLite数据库中节省很多(超过50 000行)document - key - value。 我的担心是:这些值可以是文本或数字(有日期,字符串,数字等)。 我必须请求我的基地2种方式:SQLite ERD(投与vs联盟的成本)

  • 文档的所有值####
  • 或比较操作

我想到了2个可能的解决方案:

解决方案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个选择的成本和工会
  • 我觉得这不太优雅

问题
所以来你推荐到该解决方案的问题我?为什么?你有另外一个解决方案来建议吗?

+0

' “17.5”'应该不会有行情,只是读作17.5'。而基于“日期”的示例应该投射到DATETIME,而不是FLOAT。 – MatBailie 2011-05-06 13:56:35

+0

请原谅我的无知。什么是MCD? – Tim 2011-05-06 14:28:39

+1

对不起,使用了法语的缩写:MCD代表“modèleconceptuel dedonnées”,ERM(实体关系模型)的法语名称 – CircleCode 2011-05-06 14:40:12

回答

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)

+0

如果我正确理解[亲和性转换](http://www.sqlite.org/datatype3.html#affinity),应该保留具有_REAL_亲和性的列中的文本值,以保留最后一个选项。 我想我会认真考虑这个选项:)(难道这不是一个太血腥的棘手选择吗?) – CircleCode 2011-05-06 14:45:25