使用PostgreSQL JSON列作为灵活的表模式

时间:2013-11-16 21:58:53

标签: json postgresql

我正在以这种方式构建我的PostgreSQL表的想法:

Id: uuid
Structure: JSON
Some_FK: uuid

在这种情况下,Structure列是一个JSON文档,其中包含的字段可能是表中的其他列。在这一点上,我基本上将使用RDBMS来生成和管理ID和关系,同时获得文档存储的架构灵活性。在这种用法中,文档本身没有链接在一起(难以管理),文档只是行的扩展,行是链接在一起的。

之前有没有人尝试过此类事情,或者我是否疯狂尝试以这种方式使用此功能?

2 个答案:

答案 0 :(得分:2)

我和你有类似的d ..我全都处于灵活的模式炒作中,但最后我确信,在很多情况下,一旦应用程序成熟,事务和完整性检查就不会被丢弃。

在我看来,当你需要交易并想要存储松散的分层数据而不引入新的表或单独的数据库时,混合关系+ JSON就是要走的路。例如,在我的应用程序中,我使用JSON列:

  • 带有EXIF或ZIP目录结构转储的文件元数据记录
  • 行的审计跟踪和版本转储(保存的操作数量很少)
  • 与记录相关的用户错误历史记录
  • 统计信息和预先计算的聚合
  • 通常是今天不需要的任何内容,但将来很难获得这些数据,这比非结构化日志文件更好。

当然可以在MongoDB或任何其他“NoSQL”中完成,但为什么呢?现在我明白了:

  • 一个存储数据的地方,一个协议,API等。
  • 完全一致,
  • 交易,
  • 没有孤立文档的级联删除
  • ad hoc分析查询,使用PostgreSQL 9.3,您可以轻松查询with json functions,例如我希望来自法国的所有用户今年使用Pentax相机制作的> 80%图片
  • 我将很快部署Postgres-XC以实现可扩展的master-master,
  • PLV8扩展程序我可以对我的数据can imagine执行任何操作。

答案 1 :(得分:1)

我越是想到它,它对我的​​意义就越小:你没有得到结构化数据库,强大的SQL查询,数据完整性约束等的优点;但是你在那里基本上没有使用DBMS的所有成本,并且必须自己编写用于操作数据的所有工具。

如果没有可用于无架构文档存储的系统,这可能是一种编写原型的方法,但有 - 为什么只能使用MongoDB在Postgres上构建MongoDB克隆?也许作为一个抽象的项目,某种混合可能是有意义的,但我已经超越了原型设计,分叉Postgres并删除SQL是有意义的,而不是让所有这些复杂性都未被使用。

在实际层面上,我不确定你打算如何使用外键工作;听起来像碰巧是外键的列将保留为真正的列,但任何其他列都将被嵌入到JSON文档中。这意味着要检索数据,您仍然需要使用JOIN语句手工编写SQL,但是还要有一个额外的层来操作JSON中的字段(例如,通过它们进行过滤)。或者您可能会将JSON操作硬编码到SQL表达式中的函数中,在这种情况下,您可能只有一个正常的模式。

如果您对传统架构的主要关注是运行后更改它们的成本,那么您应该更关注将模式与应用程序的其余部分隔离的中间件或ORM层。如果你有一个"无模式的"结构,每一行可以有效地具有不同的模式(JSON blob内部的结构),因此应用程序将需要处理项目类型的所有过去版本的结构。但是如果您有多个具有已定义外键的表,则包装器 还需要将更改隔离到那些,例如正在创建的表或定义的新关系,这基本上是您需要的对于完全关系模式。