我想知道为什么在 Postgres 9.3 中对 JSON 支持如此大惊小怪。JSON 与用户定义类型 (UDT) 相比有哪些优势?使用 UDT 有哪些陷阱?访问带有 UDT 的表是否效率低下?ALTER TYPE ADD 属性慢吗?Postgres 如何物理存储 UDT?
请解释并提供附加信息的链接。
我想知道为什么在 Postgres 9.3 中对 JSON 支持如此大惊小怪。JSON 与用户定义类型 (UDT) 相比有哪些优势?使用 UDT 有哪些陷阱?访问带有 UDT 的表是否效率低下?ALTER TYPE ADD 属性慢吗?Postgres 如何物理存储 UDT?
请解释并提供附加信息的链接。
正如Roman Pekar在之前的一个答案中提到的那样,JSON支持提供了更大的灵活性,并且它提供了在关系上模仿NoSQL行为的可能性。
此外,它使客户端-服务器应用程序更容易存储从客户端直接从数据库发送的 JSON 值。
可以为应用程序的客户端使用 30% 的字段,为另一个客户端使用 30%,依此类推,无需定义多个表或具有大量列的表。因此,可以将大量异构信息存储到一个地方。
最后但同样重要的是,JSON 是一种标准,许多大型编程语言都支持它。
(我们目前正在我们的项目中使用该功能(并且从 Beta 版开始就一直在使用它);此外,这是我们为应用程序选择Postgres的主要原因,因为我们需要一个主要具有解耦信息的大型数据库。我们尝试使用 NoSQL数据库,但我们需要太多的表来存储信息,而且“连接”的成本很高。另一方面,仅处理关系数据库会很困难,所以不要使用半关系半非关系,我们选择了Postgres的 JSON 支持。)
不太严重的是,它有点营销:)。更严重的是 - 内部 JSON 支持是该主题几年工作的最后阶段。内部类型和 UDT 之间没有太大区别,并且许多内部类型(和功能)以 UDT 或 UDF 开头。向上游迁移是一个相对困难的过程,并且几乎没有测试和讨论概念(和 API)。因此,内部实现显着保证了更高的质量和更高的稳定性(更少的错误,更稳定的 API)和支持。一个社区说 - “这对我们来说很有趣,我们会加强和支持”。没有其他差异 - (在性能或存储格式方面)。
关于用户定义类型的一些事情:
与 JSON 相比,用户定义的类型允许您围绕这些类型更可靠地扩展 SQL,但 JSON 为您提供了更多的灵活性。此外,嵌套类型在支持方面比 9.3 中的 JSON 对象更灵活(尽管这可能会在某些时候改变)。在 9.3 中,如果 JSON 对象完全嵌套,则无法将 JSON 对象转换为复合类型。