Jsonb vs复合类型与完全规范化有数十亿行

时间:2017-11-26 21:35:28

标签: postgresql database-design

我是一个新手学习Postgres的复杂用例,并试图了解如何构建我的数据。文档非常清楚如何实现所有这些以及如何创建索引,但由于索引和分片已正确完成,我无法找到任何性能差异的答案。

我的实际用例非常复杂和科学性质,因此这个例子非常相似,无需解释我真正想做的事情。数据本身的性质与此大致相同。

这是我想要实现的一个例子。

  • 我有数百万辆卡车和
  • 每辆卡车都有数百个盒子和
  • 每个方框最多有100个项目,每个项目都有名称,序列号,到期日期和价格。

我希望能够通过名称,exp_date,序列号或价格查询项目,并能够根据需要添加和删除单个项目。此外,我有存储过程,可以计算统计信息并在不同的表中进行报告,进行连接等。我还需要ACID支持和即时一致性,因此大多数No Sql选项都不合适。

我看到它的方式我有四种方法

1)有一个包含以下列的表:truck,box,item,serial_no,exp_date和price。

2)有三张桌子,一张是用什么卡车拿着什么箱子,一张用一个箱子拿着什么物品,一张用于单独的物品属性。

3)表有三列:store,shelve,items为JSONB

[{"name":"foo","price":4.99,"serial_no":12345,"exp_date":10-10-2018}, 
 {"name":"foo2","price":599,"serial_no":178944 "exp_date":10-10-2019}, etc...]

4)创建具有属性的复合类型项:name,price,serial_no,exp_date 然后创建一个包含商品,货架和类型项列的表。

根据我的理解,选项1最容易编写查询,但是当你进行数学计算时,我最终在一个表中有超过1000亿行,这可以创建更慢的索引,我知道这可以使它非常即使使用索引,也很难操纵如此庞大的表格。

选项2:我在项目表中的行数与选项1相同,但是有两个较少的列是非常短的文本,因此它们实际上不会节省那么多的存储空间,但我不知道是否它会影响速度。

一旦我认为配置了索引,

选项3和4是相似的。将导致更少但总体上更大的行。

我想要做的一个主要问题是查询哪辆卡车装有过期物品,存储过程将用于填写另一张桌子,告诉司机每辆卡车他的卡车中有哪些物品已过期且不应交付。

为了运行这样的查询,无论数据如何写入磁盘,在一天结束时,Postgres必须加入选项2中的表,或者取消其他选项中的数据数组,为了找到哪个卡车携带哪些物品。因此,在卡车,箱子和物品的列上放置索引的所有内容都不会更容易。

0 个答案:

没有答案