数据库:存储值可以是数字或字母数字

时间:2017-04-24 08:49:47

标签: sql database sqlite sqldatatypes

我正在尝试决定如何在我的数据库中存储一些数据。 (SQLite的) 假设我们有2个表:属性和类型

表类型或多或少类似于枚举,它存储模型中存在的所有类型(例如,整数,实数,字母数字)

表属性包含属性,记录如下所示:

Attribute :
id : its id
name : name of the attribute
value : ??? (the main question here)
type : foreign key to table type

因此属性可以是Integer,Real或alphanumeric类型。我不知道如何根据类型继续存储属性的值。

到目前为止,我已经考虑了3个解决方案:

解决方案1:属性的“value”字段是String类型,我在相关类型中转换为programmaticaly

解决方案2:我创建了更多“value”字段,如:intValue,realValue和alphanValue,并根据类型将NULL放在不相关的字段中

解决方案3:我创建了3个表,IntValue,RealValue和AlphaNValue,以及相关属性的外键。

我想知道哪种解决方案在性能和一致性方面更好,或者是否有其他相关解决方案我没有考虑过。

非常感谢

2 个答案:

答案 0 :(得分:0)

我会说:保持简单。 SQLite不是快速连接表,也不是完整的DBMS。因此,一般情况下,使用较少的表格会更好。

如果有理由让它不那么简单,我就看不出原因了。也许可以解释为什么你会在你的情况下采用更复杂的方式。

答案 1 :(得分:0)

您的问题标记为MySQL,但您说它是关于SQLLite的 - 请正确标记,它可以帮助其他人!

听起来你正在实施一个类似Entity-Attribute-Value的解决方案。关于这个概念有很多讨论 - this是最有用的一个。

对EAV提出的一个常见批评恰恰是您要问的问题 - 将数据存储在适当的数据类型中很难。

所以,如果这就是你正在做的事情,那么请看EAV的替代品 - 通常,“灵活性”带来如此多的缺点,这是不值得的。特别是在像SQLLite这样的受限环境中。

如果这不现实,我会选择选项1.在您绘制的所有选项中,您的应用程序必须在数据库外做一些工作,而选项1是最简单的。简单几乎总是更好!