【问题标题】:PostgreSQL - What should I put inside a JSON columnPostgreSQL - 我应该在 JSON 列中放入什么
【发布时间】:2021-06-15 00:59:05
【问题描述】:

我要存储的数据有这个特点的数据:

  • 字段数量有限(我不希望添加新字段);
  • 有些列对所有数据集都是通用的(例如类别字段);
  • 有些列是特定于单个数据集的(每个类别都需要自己的字段);

这是它在常规表中的样子:

对于这种情况,我无法确定哪种方法更适合将此数据存储在数据库中。

以下是我已有的想法:

  • 完全按照表格执行(我会有很多 NULL 值);
  • 将类别划分为表格(我会在需要时使用连接);
  • 使用 JSON 类型来存储值(没有 NULL 值并将其全部放在同一个表中)。

所以我的问题是:

  1. 这些解决方案之一(或我没有考虑过的)是否更适合这种情况?
  2. 在做出此决定时,除了此处介绍的因素外,我还应考虑其他因素吗?

【问题讨论】:

    标签: sql json postgresql database-design


    【解决方案1】:

    除非您有很多列(~ 100),否则通常最好使用普通列。 NULL 值在 PostgreSQL 中不占用任何存储空间。

    另一方面,如果您的查询可以在WHERE 条件中使用这些列中的任何一个,并且您与= 进行比较,则jsonb 上的单个 GIN 索引可能比拥有多个 B 更好-树索引,因为索引维护成本会更高。

    最终答案取决于您计划在该表上运行的 SQL 语句。

    【讨论】:

    • 我不明白如果我必须使用 WHERE 条件,为什么 json 会更好。直觉上,我认为这些条件更适合常规列。你能解释一下吗?
    • 那么“多列”的标准是什么? 10、100、1000……?我相信有一部分与它的应用有关,但你认为我们应该尊重一个限制(一些经验法则)吗?
    • 我已经添加了一个解释和对“许多”的估计——但这只是我个人的直觉。
    【解决方案2】:

    您已经很好地列出了三个选项。需要考虑的事项是:

    • 性能
    • 数据大小
    • 每次维护
    • 灵活性
    • 安全性

    请注意,您甚至没有提到安全注意事项。但是表级别的安全性通常比列级别的安全性要简单一些,并且对于 PII(个人身份信息)等受监管的数据可能很重要。

    JSON 解决方案的主要优势在于灵活性。添加新列很容易。但你不需要那个。 JSON 在数据大小和数据类型灵活性方面存在成本(特别是 JSON 不明确支持日期/时间)。

    多表解决方案需要复制主键,但如果列确实稀疏,则可能会导致整体存储空间减少。 “可能”也可能取决于数据类型。例如,NULL 字符串占用的空间比表记录中的 NULL 浮点数要少。

    多个表的连接将是主键上的 1-1。这些应该很快。

    我会怎么做?除非答案很明显,否则我会将数据转储到包含一堆列的单个表中。如果该表开始变得笨拙,那么我会考虑将其拆分为单独的表 - 但仍然有一个用于公共列的表。一个或多个表的详细信息可以隐藏在视图后面。

    【讨论】:

      【解决方案3】:

      取决于您要存储多少数据,但只要它是有限的,它是否包含大量空值应该不会有太大的区别

      【讨论】:

      • 列数是有限的,但行数不是。它可以变得相当大
      • 哦,对不起,那是我的错,你是对的,但有了这些知识,我认为它不会有太大变化,在很多数据库中,null 不会占用任何存储空间,所以我猜猜没问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2021-04-25
      相关资源
      最近更新 更多