PostgreSQL NULL与独立表

时间:2018-05-20 17:33:04

标签: postgresql database-performance

我有一个名为transactions的不断增长的表,每月增长约1000万行。

此表格中有一个名为jsonb的{​​{1}}列。

extra条记录的extra列的70%为NULL,其余部分的json值如下:

transactions

注意:所有{ "lang": "en", "pages": 3, "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Egestas purus viverra accumsan in nisl nisi. Arcu cursus vitae congue mauris rhoncus aenean vel elit scelerisque. In egestas erat imperdiet sed euismod nisi porta lorem mollis. Morbi tristique senectus et netus. Mattis pellentesque id nibh tortor id aliquet lectus proin. Sapien faucibus et molestie ac feugiat sed lectus vestibulum..." } 个json键都是固定的,不会改变。

extra表的概述:

transactions

为什么我这样做?

我使用id | price | type | extra ------------------------------------------- 1 | 2000.00 | SMS | null 2 | 2000.00 | SMS | null 3 | 4000.00 | SMS | null 4 | 5000.00 | SMS | {"lang": "en", "pages":8, "message":"Lore..."} 5 | 4000.00 | SMS | null 6 | 4000.00 | SMS | null 7 | 5000.00 | SMS | {"lang": "de", "pages":5, "message":"Some..."} 列而不是三个单独的列来避免许多NULL值。

使用jsonb我只在1列上只有30%的NULL,但是当我使用3个单独的列而不是1个jsonb列时,每列都有30%的NULL。

问题:

将我的jsonb列拆分为3个单独的列是不错的主意?

像这样:

extra

或者,我可以添加一个额外的表(例如id | price | type | lang | pages | message -------------------------------------------- 1 | 2000.00 | SMS | null | null | null 2 | 2000.00 | SMS | null | null | null 3 | 4000.00 | SMS | null | null | null 4 | 5000.00 | SMS | en | 8 | Lorem... 5 | 4000.00 | SMS | null | null | null 6 | 4000.00 | SMS | null | null | null 7 | 5000.00 | SMS | de | 5 | Some... )与一对一的关系。像这样:

transcations

transaction_info

transaction_info

id |  price  | type
-------------------
 1 | 2000.00 | SMS 
 2 | 2000.00 | SMS 
 3 | 4000.00 | SMS 
 4 | 5000.00 | SMS 
 5 | 4000.00 | SMS 
 6 | 4000.00 | SMS 
 7 | 5000.00 | SMS 

使用这种方法,我在两个表上都没有任何NULL值。

您更喜欢哪一个?

1 个答案:

答案 0 :(得分:1)

你应该阅读一些关于正常形式的内容 - 1. NF说 - 每个值都是原子的。这要求任何属性都有自己的列 - 这通常是个好主意(当属性数小于50时)。 NULL值只需要1bite - 并且可能将数据存储在干净的关系1NF中比在JSON格式中更有效。

所以,因为你的新专栏只有三个,那么我对你问题的回答是肯定的。这是个好主意。

第二个问题是一个或两个表 - 没有干净的回复 - 从关系模型的角度来看,这两个变量都是正确的。如果在现实中存在明显的分离 - 有两个实体,那么我更喜欢两个表。在其他地方(当列数很小时)我更喜欢一张桌子。