我想知道以下情况的最佳方法是什么:
我在数据库中有一个订单表,显然包含所有订单。但这些实际上是所有订单,因此包括刚刚标记为“完成”的完整/完成的订单。我想从所有未清订单中计算一些东西(如未清金额、未清项目等)。什么是更好的性能明智:
保留 1 个包含所有订单的订单表,包括完整/存档的订单,并通过过滤“完成”标志进行计算?
或者我应该创建另一个表,例如'Orders_Archive',以便订单表仅包含我用于计算的未结订单?
这些方法有任何(明显的)性能差异吗?
(顺便说一句,我在 PostgreSQL 数据库上。)
最佳答案
这是数据库设计中的一个常见问题:是否分离或“归档”不再“活跃”的记录的问题。
最常见的方法是:
- 所有内容都在一张表中,根据需要将订单标记为“完成”。优点:最简单的解决方案(代码和结构方面),良好的灵 active (例如易于“恢复”订单)。缺点:表可能会变得非常大,这对于查询和例如查询都是一个问题。备份。
- 将旧资料归档到单独的表格中。解决了第一种方法中的问题,但代价是更加复杂。
- 使用基于值的分区表。这意味着逻辑上(对应用程序而言)一切都在一个表中,但在幕后,DBMS 根据某些列的值将内容放入不同的区域。您可能会使用“完成”列或“订单完成日期”进行分区。
最后一种方法结合了前两种方法的优点,但需要 DBMS 的支持并且设置起来更复杂。
注意:
只存储“归档”数据的表通常称为“归档表”。一些 DBMS 甚至为这些表提供特殊的存储引擎(例如 MySQL),这些引擎经过优化以允许快速检索和良好的存储效率,但代价是缓慢的更改/插入。
关于数据库性能 : filtering on column vs. 分表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4032078/