2010-06-18 48 views
3

我想将条目(一组键=>值对)存储在数据库中,但键的条目因条目而异。模拟sqlite中的变量列名

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

有没有更好的方法?如果这在sqlite中不可行,是否可以在mysql中使用?谢谢!

回答

4

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

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

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

1

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

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

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

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

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