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