3

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

我想用两个表存储,(1)每个条目的键和(2)每个条目的特定键的值,其中条目在两个表中共享一个公共 id 字段,但我不知道如何拉具有这种配置的 sql 中的 key=>value 对条目。

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

4

2 回答 2

4

听起来您正在寻找Entity-Attribute-Value 模型

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

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

于 2010-06-18T21:15:57.957 回答
1

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

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

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

如果您需要每个实体的可变列,则需要一个非关系数据库。有像CouchDBMongoDB这样的面向文档的数据库正在流行起来。

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

于 2010-06-18T21:24:04.757 回答