Database design 关系数据库设计良好实践:规范化?

Database design 关系数据库设计良好实践:规范化?,database-design,jsonb,Database Design,Jsonb,我正在开发一个应用程序,它的主要目的是根据用户的偏好和个性推荐其他用户(每个推荐单独处理)。 什么是一个好的实践?要将信息存储在3个单独的表中(users、user\u preferences和user\u details),或者使用一个表users和两个jsonb列?1],考虑到您的事务是OLTP(在线事务处理),您应该计划使用3个单独的表。在使用各种联接检索表数据时,它将使您获得更好的性能。请始终规范化您的架构。首先,需要注意的是,根据您尝试执行的操作,jsonb可能会破坏第一个正常形式。让

我正在开发一个应用程序,它的主要目的是根据用户的偏好和个性推荐其他用户(每个推荐单独处理)。
什么是一个好的实践?要将信息存储在3个单独的表中(
users
user\u preferences
user\u details
),或者使用一个表
users
和两个
jsonb
列?

1],考虑到您的事务是OLTP(在线事务处理),您应该计划使用3个单独的表。在使用各种联接检索表数据时,它将使您获得更好的性能。请始终规范化您的架构。

首先,需要注意的是,根据您尝试执行的操作,jsonb可能会破坏第一个正常形式。让我们讨论1NF以及为什么它是一个好主意:

第一范式存在的条件是且仅当:

  • 所有行都由具有相同列数的数据组成
  • 所有行都是唯一的
  • 所有列中的所有值都是原子的
  • 前两个很容易理解,但第三个事实上是有争议的。这是否意味着一切都必须最大限度地分解?只要datetime列是允许的,就不意味着

    在我看来,考虑原子性要求的最佳方式是表中的每个值都表示域中的单个值。因此,这里有两件事打破了原子性要求1NF。第一种是集合(使用顺序无关紧要的数组,例如博客文章上的标签),第二种是存储具有内部函数依赖关系的数据

    为什么这两者都很重要?列中的Mamanging集合为数据库中的大量额外工作创造了很多机会。而可传递的依赖关系也会带来问题,例如,您不能让来自jsonb中字段的外键引用另一个表中的内容


    就性能而言,如果您所做的只是存储首选项和应用程序blob,那么您可能不会看到太大的差异,因此附加功能很重要。请注意,PostgreSQL(不能代表其他数据库)将支持大字段。烤字段在某些情况下会增加额外的开销,但在其他情况下则不会。与连接相比,测量这对查询的影响要困难得多。因此,这是另一个反对它的标志。吐司是一个伟大的技术顺便说一句,但它不是一个免费的午餐。因此,您可能会有相同的性能影响,但透明度要低得多。

    好的做法取决于您使用的数据库类型。如果您使用的是关系数据库,那么您可以。如果您使用的是NoSQL数据库,则需要创建文档。