PostgreSQL空与单独表

PostgreSQL空与单独表,postgresql,database-performance,Postgresql,Database Performance,我有一个不断增长的表,名为transactions,每月增长约1000万行 此表有一个名为extra的jsonb列 transactions记录的extra列中有70%是空的,其余的记录有如下json值: { "lang": "en", "pages": 3, "message": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labor

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

此表有一个名为
extra
jsonb

transactions
记录的
extra
列中有70%是空的,其余的记录有如下json值:

{
   "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..."
}
注意:所有
extra
json键对于所有行都是固定的,不会更改

交易概述
表:

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..."}
我为什么这么做?

我使用
jsonb
列而不是三个单独的列来避免许多空值

对于
jsonb
1列,我只有30%的空值,但是当我使用3个单独的列而不是1个jsonb列时,每列有30%的空值

问题:

将my
extra
列拆分为3个单独的列是好主意吗

像这样:

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...
或者,我可以添加一个具有一对一关系的额外表(例如
transaction\u 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 
交易信息

id |  transaction_id  | lang  | pages |  message       
--------------------------------------------
 1 |       4          |   en  |   8   |  Lorem...
 2 |       7          |   de  |   5   |  Some...
使用这种方法,两个表上都没有任何空值


你更喜欢哪一种?

你应该读一些关于正规形式的书-1。NF说——每个值都是原子的。这样任何属性都有自己的列——这通常是个好主意(当属性数少于50时)。空值只需要1个站点—并且可能以干净的关系1NF格式存储数据比JSON格式更有效

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


第二个问题是一个或两个表-没有明确的答案-从关系模型的角度来看,这两个变量都是正确的。如果现实中存在可见的分离——有两个实体,那么我更喜欢两个表。在其他地方(当列数较少时),我更喜欢一个表。

是的,在这种情况下,我更喜欢一个表。只有当额外信息的概率较低时,两个表才有一些好处。