Database 如何通过数据库迁移处理旧数据?

Database 如何通过数据库迁移处理旧数据?,database,database-design,database-migration,Database,Database Design,Database Migration,我正在投入一个已经运行了一段时间的项目。我的首要任务之一是添加一些列,这些列将基本上替换现有列。我应该如何处理旧数据 新列旨在“分解”现有列,从而为值添加更细粒度的详细信息。以下结构在概念上与我正在处理的结构相同: # Current Schema TotalPrice: BigInt # New Schema BasePrice: BigInt Markup: BigInt Tax: BigInt 从概念上讲,TotalPrice==(基价+加价+税) 作为此迁移的一部分,处理所有已具有T

我正在投入一个已经运行了一段时间的项目。我的首要任务之一是添加一些列,这些列将基本上替换现有列。我应该如何处理旧数据

新列旨在“分解”现有列,从而为值添加更细粒度的详细信息。以下结构在概念上与我正在处理的结构相同:

# Current Schema
TotalPrice: BigInt

# New Schema
BasePrice: BigInt
Markup: BigInt
Tax: BigInt
从概念上讲,
TotalPrice==(基价+加价+税)

作为此迁移的一部分,处理所有已具有
TotalPrice
值的行的最佳方法是什么?我已经制定了两个选项,我正在寻找一些权威性的指导,哪种方法在维护、推理等方面“更好”。我也对其他方法持开放态度

保留
TotalPrice
按原样保留旧数据,通过ORM将列设为只读(我使用的是Django),并在代码中引入条件以首先检查此“遗留”列中的值。这在代码级别上感觉更复杂,但将数据保留在其最初预期的心智模型中,使其在将来更易于推理和处理

TotalPrice
移动到一个新列中 保留数据,但可以说重新标记它。这会使代码更干净,但会使我们遇到一些潜在的奇怪情况,即只有一个新列具有大量记录的值,而预期的情况是所有3个新列的值都大于0

在我看来,从长远来看,第一种方法似乎更好。它更明确(带有
TotalPrice
的记录表示创建时的信息),并且在处理具有隐含第二含义的列时(例如
BasePrice
都是基价,但对于旧记录,有时是
TotalPrice
)需要较少的注释来解释“这里发生了什么”。但我不完全确定,如果坚持这个专栏和相关的代码流,是否值得一个更简单的心智模型

想象一下,许多代码看起来像:

如果目标总价:
返回对象总价
其他:
返回对象基价+对象加价+对象税
在这里,我们总是需要进行一种duck类型的输入,以查看它是否是一个“遗留”记录


“这并不重要”也是一个可以接受的答案

最终结果应该是一个具有一致有效数据的数据库。如果没有,那么您将遇到问题,例如,当有人希望随着时间的推移平均标记%——它将不起作用,或者将为旧数据提供无效的结果。有没有办法近似或推导出其他值?即使这是最好的猜测,也可能更好;如果你担心的话,请包括一个估计的标志,这样你就可以说清楚了。啊,这是一个伟大的观点:随着时间的推移,一致地使用数据进行比较是一个我没有考虑过的问题!考虑到这一点,第二种方法似乎更好,对我来说,“估计”标志才是真正的关键。谢谢