【问题标题】:Storing dynamic properties of objects in SQL [duplicate]在 SQL 中存储对象的动态属性
【发布时间】:2014-02-20 06:04:37
【问题描述】:

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

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

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

【问题讨论】:

  • 我建议搜索适合您的应用程序要求的 nosql db。您描述的方法是常见 EAV 反模式的变体。它可以用于少量的动态数据,但是当您拥有数百万个对象时,它的性能就很差了。
  • 你看过hstore吗?
  • 确实,我们已经使用 hstore 好几年了,它运行良好。从 pg9.3 开始,我们也使用了一些 JSON。
  • 我之前没有听说过 hstore,但在做了一些研究之后,这看起来像是最终的出路,谢谢!

标签: sql postgresql many-to-many schema


【解决方案1】:

这个之前已经多次讨论过:

简短版本:EAV 有它的位置,但通常最好使用json、XML 或hstore。 PostgreSQL 9.4 的增强版json 可能会成为最有吸引力的选择,因为它结合了jsonhstore 的优点。

【讨论】:

  • 是的,我完全同意你的观点,9.4 中的 JSON 看起来像是灵丹妙药。不过现在,hstore 将适用于我的大多数用例,因为我不需要嵌套数据。感谢您的意见!
【解决方案2】:

首先,您应该从正确的数据库架构开始(使用标准的data model patterns),以便尽可能避免这种情况。

Martin Fowler 建议使用序列化的 LOB(例如 JSON 或 XML),或者允许用户编辑自己的数据库架构(这是我的首选方法):

http://martinfowler.com/bliki/UserDefinedField.html

Bill Karwin 在某处有一篇关于创建第二个表以索引 blob 字段中的值的帖子,但我现在找不到。当我这样做时会发布。

【讨论】:

猜你喜欢
  • 2013-01-25
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2012-06-19
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
相关资源
最近更新 更多