【问题标题】:PostgreSQL: JSON column or one-to-many table for config optionsPostgreSQL:用于配置选项的 JSON 列或一对多表
【发布时间】:2019-02-14 19:36:39
【问题描述】:

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

随着时间的推移,这导致表格的宽度变得非常大,我认为是时候将其迁移到新的东西了,所以我想将所有与“选项”相关的列删除到单独的数据结构中。

根据我的经验,执行此操作的典型方法是创建一个仅包含 option_idoption_name 的新表,以及包含 user_idoption_id、@ 的第二个新表例如 987654326@。

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

我应该提到用户数量将非常低,只会达到数千,而列数可能并且将会达到数百。

有人对这里的最佳前进方式提出建议吗?

【问题讨论】:

    标签: postgresql database-normalization


    【解决方案1】:

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

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

    这两种方法通常都适用于这类问题,不一定是坏事。一般来说,去规范化通常是一种现在付款或以后付款的解决方案。但是对于像用户偏好这样的东西,可能不会像大多数面向业务的问题领域那样,有事后付费的惩罚。

    不过,您应该考虑规范化的数据库结构。

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

    我建议搜索 Stack Overflow、那个 DBA 站点和更广泛的 Internet,以讨论用于存储用户偏好的数据库设计。喜欢this

    【讨论】:

    • 感谢您的回复。我不确定是否有任何列是“不相关的”——它们都与用户直接相关,这就是信息在用户表中的原因。您会推荐哪种标准化结构?
    • @Kieran 你应该在你的问题中澄清这个事实。您的第一句话使我相信您在某些领域为某些用户设置了一些设置,在其他领域为其他用户设置了其他设置,在其他领域还为其他目的设置了其他设置。明确所有宽表中的字段确实适用于每个用户。为了清楚起见,重写第一句话,因为它的意思在我读了三遍后仍然无法理解。
    • 我认为它已经足够清楚了,因为它以“我们目前有一个存储用户信息的表”开头,但我仍然对其进行了编辑,所以希望现在更清楚一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多