我想在数据库中存储条目(一组key =>值对),但密钥因条目而异。
我想用两个表存储,(1)每个条目的键和(2)每个条目的特定键值,其中条目在两个表中共享一个公共id字段,但我不确定如何使用这种配置在sql中将条目作为key =>值对进行拉取。
有更好的方法吗?如果在sqlite中这是不可能的,那么在mysql中是否可能?谢谢!
答案 0 :(得分:4)
听起来你正在寻找Entity-Attribute-Value model。
替代方法是为不同类型的实体创建不同的表,或者为每个可能的键创建一个包含列的表,并为没有该键的实体将值设置为NULL。
您可能需要查看Bill Karwin的演示SQL Antipatterns,其中介绍了EAV模型的一些优缺点,并提出了可能的替代方案。相关部分从幻灯片16开始。
答案 1 :(得分:1)
在关系数据库中,关系中的每一行都必须包含相同的列。这是关系定义的一部分。在SQLite,MySQL或任何其他关系数据库中都是如此。
另请参阅我的演示文稿Practical Object-Oriented Models in SQL或我的书SQL Antipatterns,其中我展示了EAV模型引起的问题。
如果每个实体需要变量列,则需要非关系数据库。面向文档的数据库如CouchDB或MongoDB正在流行。
如果您想要一个像SQLite这样的嵌入式单用户解决方案,请尝试Berkeley DB。