Moh*_*mal 6 postgresql database-design
我是一个新手,在复杂的用例中学习 Postgres,并试图了解如何构建我的数据。文档非常清楚如何实现所有这些以及如何创建索引,但鉴于索引和分片已正确完成,我找不到任何性能差异的答案。
我的实际用例本质上是非常复杂和科学的,所以这个例子非常相似,而无需解释我真正想要做什么。数据本身的性质与此大致相同。
这是我试图实现的一个例子。
我希望能够按名称、exp_date、序列号或价格查询项目,并能够根据需要添加和删除单个项目。此外,我有存储过程,可以计算统计信息并在不同的表中报告它,进行连接等。我还需要 ACID 支持和即时一致性,因此大多数 No Sql 选项都不合适。
在我看来,我有四种方法来解决这个问题
1) 有一个包含以下列的表格:卡车、箱子、物品、序列号、exp_date 和价格。
2)有三张表,一张是什么车载什么箱子,一张是一箱子载什么物品,一张是各个物品属性。
3) 包含三列的表:store、shelve、items as 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...]
Run Code Online (Sandbox Code Playgroud)
4) 创建具有属性的复合类型项目:名称、价格、serial_no、exp_date,然后创建一个包含类型项目的 store、shelve 和列的表。
据我所知,选项 1 是最容易编写查询的,但是当你做数学运算时,我最终在一个表中拥有超过 1000 亿行,这可能会创建更慢的索引,据我所知,这会使操作变得非常慢如此庞大的表,即使有索引。
选项 2:我将在项目表中的行数与选项 1 相同,但少两列是非常短的文本,因此它们确实不会节省那么多存储空间,但我不知道它是否会影响速度.
我认为一旦配置了索引,选项 3 和 4 是相似的。将导致更少但总体上更大的行。
我想要做的主要查询之一是查询哪辆卡车载有过期物品,将使用存储过程填充另一个表,告诉每辆卡车的司机他卡车中的哪些物品已过期并且应该不交付。
为了运行这样的查询,在一天结束时,无论数据如何写入磁盘,Postgres 都必须加入选项 2 中的表,或者在其他选项中取消嵌套数据数组,以便找出哪辆卡车运载哪些物品。因此,将所有内容都放在一张表中并在卡车、箱子和物品的列上使用索引并不容易。