PostgreSQL:JSON列或用于配置选项的一对多表

时间:2019-02-12 19:29:29

标签: postgresql database-normalization

我们目前有一个表,用于存储有关用户的信息。一些列包含诸如用户ID,名称等信息,而其他许多列(布尔值,整数和varchars等)则包含每个用户的配置选项。

随着时间的流逝,表的宽度变得越来越大,我认为现在是时候将该表迁移到新的东西了,所以我想将所有与“选项”相关的列删除到一个单独的数据结构中。

根据我的经验,典型的做法是创建一个新表,其中仅包含option_idoption_name,再创建一个新表,其中包含user_idoption_idoption_value

但是,一位同事建议使用新的jsonb列类型作为替代,但是我不知道我是否喜欢以非关系方式存储关系数据的想法。从Java的角度来看,就我所知,它几乎是一样的-它将变成POJO,然后缓存在对象上。

我应该提到用户数量将非常少,只有数千名用户,并且列数量可以并且将达到数百名。

有人在这里提出最佳建议吗?

1 个答案:

答案 0 :(得分:2)

从技术上讲,您已经通过向表中添加与存储在其中的某些实体无关的列来规范化数据库结构。

使用JSON只是反规范化的另一种方法,将一堆值塞到单个行列字段中。然后,出色的binary support for JSON in Postgresjsonb数据类型)使您可以索引这些JSON文档中的元素,以快速访问那些嵌入值。从关系的角度来看这很麻烦,但是在某些情况下很方便。

对于这种问题,通常都采用两种方法,但不一定都是不好的方法。通常,去规范化通常是“先付后付”的解决方案。但是对于诸如用户首选项之类的东西,可能不会像在大多数面向业务的问题域那样经常支付更高的报酬。

尽管如此,您仍应考虑规范化的数据库结构。

顺便说一句,最好在姐妹站点http://DBA.StackExchange.com/中询问这种表结构问题。

我建议搜索Stack Overflow,该DBA网站和更广泛的Internet,以讨论用于存储用户首选项的数据库设计。像this