在sqlite中模拟变量列名

时间:2010-06-18 21:10:12

标签: sql mysql sqlite entity-attribute-value

我想在数据库中存储条目(一组key =>值对),但密钥因条目而异。

我想用两个表存储,(1)每个条目的键和(2)每个条目的特定键值,其中条目在两个表中共享一个公共id字段,但我不确定如何使用这种配置在sql中将条目作为key =>值对进行拉取。

有更好的方法吗?如果在sqlite中这是不可能的,那么在mysql中是否可能?谢谢!

2 个答案:

答案 0 :(得分:4)

听起来你正在寻找Entity-Attribute-Value model

替代方法是为不同类型的实体创建不同的表,或者为每个可能的键创建一个包含列的表,并为没有该键的实体将值设置为NULL。

您可能需要查看Bill Karwin的演示SQL Antipatterns,其中介绍了EAV模型的一些优缺点,并提出了可能的替代方案。相关部分从幻灯片16开始。

答案 1 :(得分:1)

@Mark Byers是对的,这是EAV模型。在走向那条黑暗的道路之前,你应该阅读Bad CaRMa。这是一个关于这个数据库设计如何实际摧毁一家公司的故事。

在关系数据库中,关系中的每一行都必须包含相同的列。这是关系定义的一部分。在SQLite,MySQL或任何其他关系数据库中都是如此。

另请参阅我的演示文稿Practical Object-Oriented Models in SQL或我的书SQL Antipatterns,其中我展示了EAV模型引起的问题。

如果每个实体需要变量列,则需要非关系数据库。面向文档的数据库如CouchDBMongoDB正在流行。

如果您想要一个像SQLite这样的嵌入式单用户解决方案,请尝试Berkeley DB