在SQL中存储对象的动态属性

时间:2014-01-28 18:41:13

标签: sql postgresql many-to-many schema

我正在尝试在SQL中存储有关对象的“动态”属性。举个例子,假设我有一个名为objs的表,它有两列(idname)。现在,一些用户可能希望存储名为hocus的属性,而其他用户可能希望存储名为pocus(甚至banana)的属性。真的。

我的想法是创建两个表,propsobj_propsprops会有两列(idprop_name),而obj_props会有(obj_idprop_idvalue )。

我唯一担心的是,如果有数百万个对象,每个都有20-30个属性,这似乎是很多开销。我知道我可以在obj_propsobj_id上的prop_id创建一个索引,但这仍然可以很好地执行吗?这样的事情有更好的解决方案吗?我正在研究MongoDB,但缺少连接令人沮丧。

2 个答案:

答案 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可能会成为最具吸引力的选择,因为它结合了jsonhstore的优势。