SQLite ERD(演员与工会的成本)

时间:2011-05-06 12:51:36

标签: sql sqlite casting union erd

我必须在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)

我喜欢此解决方案

  • 不再演员

我不喜欢这个解决方案

  • 获取所有值的成本为3选择和联合
  • 我发现这不是优雅

问题
那么问题是你向我推荐哪种解决方案?为什么?你有其他解决方案吗?

1 个答案:

答案 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)