我正在尝试在SQL中存储有关对象的“动态”属性。举个例子,假设我有一个名为objs
的表,它有两列(id
,name
)。现在,一些用户可能希望存储名为hocus
的属性,而其他用户可能希望存储名为pocus
(甚至banana
)的属性。真的。
我的想法是创建两个表,props
和obj_props
。 props
会有两列(id
和prop_name
),而obj_props
会有(obj_id
,prop_id
和value
)。
我唯一担心的是,如果有数百万个对象,每个都有20-30个属性,这似乎是很多开销。我知道我可以在obj_props
和obj_id
上的prop_id
创建一个索引,但这仍然可以很好地执行吗?这样的事情有更好的解决方案吗?我正在研究MongoDB,但缺少连接令人沮丧。
答案 0 :(得分:3)
首先,您应该从正确的数据库架构开始(使用标准data model patterns),以便尽可能避免这种情况。
Martin Fowler建议使用序列化LOB(如JSON或XML),或允许用户编辑自己的数据库模式(这是我首选的方法):
http://martinfowler.com/bliki/UserDefinedField.html
Bill Karwin在创建第二个表格的某个地方有一个帖子来索引blob字段中的值,但我现在找不到它。我会这样做。
答案 1 :(得分:3)
之前已经反复讨论过:
简短版本:EAV有它的位置,但使用json
,XML或hstore
通常更好。 PostgreSQL 9.4的增强型json
可能会成为最具吸引力的选择,因为它结合了json
和hstore
的优势。