我是一个新手学习Postgres的复杂用例,并试图了解如何构建我的数据。文档非常清楚如何实现所有这些以及如何创建索引,但由于索引和分片已正确完成,我无法找到任何性能差异的答案。
我的实际用例非常复杂和科学性质,因此这个例子非常相似,无需解释我真正想做的事情。数据本身的性质与此大致相同。
这是我想要实现的一个例子。
我希望能够通过名称,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中的表,或者取消其他选项中的数据数组,为了找到哪个卡车携带哪些物品。因此,在卡车,箱子和物品的列上放置索引的所有内容都不会更容易。