Postgresql 存储用户定义的段JSONB与单独的表?

Postgresql 存储用户定义的段JSONB与单独的表?,postgresql,database-design,schema,Postgresql,Database Design,Schema,我想存储用户定义的段。一个段将由几个不同的规则组成。我想我要么创建一个单独的“规则”表,其中包含三列:属性名、运算符和值。例如,如果某个细分市场是美国的用户,则在其各自的列中规则为“country=US”。一个段可以有许多规则 另一个选项是通过Postgres将它们作为JSONB存储在段表的“Rules”列中。我会遵循与上面类似的模式,使用一系列规则或其他东西。每种方法的优缺点是什么 也许这两种方法都不正确。我会选择第一种方法,将数据片段单独存储在关系数据库中。听起来您的数据(段->规则)总是包

我想存储用户定义的段。一个段将由几个不同的规则组成。我想我要么创建一个单独的“规则”表,其中包含三列:属性名、运算符和值。例如,如果某个细分市场是美国的用户,则在其各自的列中规则为“country=US”。一个段可以有许多规则

另一个选项是通过Postgres将它们作为JSONB存储在段表的“Rules”列中。我会遵循与上面类似的模式,使用一系列规则或其他东西。每种方法的优缺点是什么


也许这两种方法都不正确。

我会选择第一种方法,将数据片段单独存储在关系数据库中。听起来您的数据(段->规则)总是包含相同的结构(这相当简单),因此没有迫切的理由将数据存储为JSON

作为旁注,我认为您需要“Rules”表中的另一列,作为“Segments”表的外键

方法1的优点:

  • 数据易于搜索和选择。您的SQL语句可以直接访问有关规则的特定信息(特定运算符、名称、值等),而无需解析所需规则的JSON对象
  • 上述操作将缩短处理时间
  • 只需解析JSON一次(在插入之前)
方法1的缺点:

  • 需要在插入之前解析JSON
  • 每个段需要多个插入

关于您的最后一句话,如果您不了解更多有关预期功能的信息,就很难规定数据库设计。例如,如果属性名称的含义超出了单个段,则您可能希望单独存储属性名称并在规则表中引用它们。

选择基本上与您希望读取数据的方式有关

如果满足以下条件,您最好使用JSON:

  • 您不打算通过规则进行筛选(使用
    WHERE
    子句)
  • 您不需要获取统计信息(即,
    分组依据
  • 您不会暗示对属性/运算符/值有任何约束
  • 您只需选择值(
    select…,Rules
如果满足这些要求,您可以将数据存储为JSON,从而消除连接和子选择,消除主键和规则索引的开销,等等


但是如果您不满足这些要求,您应该将数据存储在一个通用的关系设计中—您的方法1。

我也不确定规则模式是否会保持不变。例如,现在我要为规则“Name,Value,Operator”创建一个模式,但是如果运算符介于两者之间,我需要两个值怎么办?我认为JSONB给了我这种灵活性,对吗?这就是你所说的“你不会暗示对属性/运算符/值有任何约束”的意思吗?这正是我的意思。您可以在JSON中自由存储任何半结构化数据。谢谢!如果我正在使用Postgres的这个功能,使用无模式数据库或类似的东西是否有意义?也许DynamoDB?我不会走那么远:)当您需要处理我在答案中提到的4个项目时,关系数据库有很大的优势,而在许多其他情况下,我没有提到。我个人坚持使用PostgreSQL作为功能齐全的对象关系数据库,在不需要“严格”模式时使用JSONB,其思想是基于段查询其他数据。所以这些规则将组成段,然后我将根据用户所在的段提供数据。这有意义吗?下面是一个将规则存储为json的jsonb数组的示例。有关表的完整结构以及要运行的查询,请参阅接受的答案: