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

时间:2016-08-28 21:05:31

标签: postgresql database-design schema

我想存储用户定义的细分。细分将包含几个不同的规则。我以为我要么创建一个单独的表格" Rules"有三列:属性名称,运算符和值。例如,如果Segment是美国的用户,则该规则将是" country = US"在各自的专栏中。细分可以有很多规则。

另一个选择是通过Postgres将这些作为JSONB存储在"规则"段表中的列。我遵循与上述类似的模式,带有一系列规则或其他东西。每种方法的优缺点是什么?

也许这些都不是正确的做法。

2 个答案:

答案 0 :(得分:1)

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

作为附注,我认为您将需要“规则”表中的另一列,作为“细分”表的外键。

接近1的优点:

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

接近1的缺点:

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

关于您的最后一句,如果不了解您的预期功能,很难规定数据库设计。例如,如果属性名称具有超出单个段的含义,则您需要单独存储属性名称并在“规则”表中引用它们。

答案 1 :(得分:1)

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

如果符合以下条件,您最好使用JSON:

  • 您不会通过规则
  • 过滤(使用WHERE子句)
  • 您无需获取统计信息(即GROUP BY
  • 您不会暗示对属性/运算符/值的任何约束
  • 您只需选择值(SELECT ..., Rules
  • 即可

如果满足这些要求,您可以将数据存储为JSON,从而消除了JOIN和子选择,消除了规则等主键和索引的开销。

但如果你不满足这些要求,你应该将数据存储在一个共同的关系设计中 - 你的方法1。