2

想象一下,我有一张个人信息的临时表:

  • UUID (varchar)
  • main_document (varchar)
  • 名称(varchar)
  • DoB(时间戳)
  • 流派(varchar)
  • 地址(varchar)
  • 工资(十进制)

T1我运行模式迁移并添加一个新列,从现在开始,表有:

  • UUID (varchar)
  • main_document (varchar)
  • 名称(varchar)
  • DoB(时间戳)
  • 流派(varchar)
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)*

然后在T2运行另一个模式迁移并将 main_document 的数据类型更改为 NUMBER。

  • UUID (varchar)
  • main_document ( NUMBER )*
  • 名称(varchar)
  • DoB(时间戳)
  • 流派(varchar)
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)

然后在T3我运行另一个模式迁移并删除流派列

  • UUID (varchar)
  • main_document(编号)
  • 名称(varchar)
  • DoB(时间戳)
  • --------------- *
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)

然后在T4我运行另一个模式迁移并添加流派列,但现在它具有数据类型 NUMBER。

  • UUID (varchar)
  • main_document(编号)
  • 名称(varchar)
  • DoB(时间戳)
  • 流派 (NUMBER) *
  • 地址(varchar)
  • 工资(十进制)
  • 电子邮件(varchar)

如果架构在 T1、T2、T3、T4 等上发生更改,我如何查询我的数据库(及时返回)?

就像,我们在(墙上时间)T4并运行: select * from people AS OF T3,应该返回什么?真的是时间旅行吗?

是否有任何最佳实践或策略来避免这些临时表 + 模式迁移的所有这些复杂性?

任何帮助将非常感激。

谢谢

4

1 回答 1

2

我建议您查看基于版本的重新定义 (EBR) 概念文件:

https://www.oracle.com/a/tech/docs/ebr-technical-deep-dive-overview.pdf

即使您不打算使用 EBR,您也可以了解模式迁移是如何完成的,同时仍然允许在其历史的各个点查看模式。

简而言之,表代表数据的所有时间状态,视图代表时间点。因此,举一个更简单的例子:

Time 1: Table is ID, NAME, GENDER
Time 2: Table is ID, NAME, DATE_OF_BIRTH

然后该表包含来自所有时间线的所有属性,即

ID、姓名、性别、DATE_OF_BIRTH

并且您使用视图来控制数据的基于时间的视图,例如

VIEW1: select ID, NAME, GENDER from TABLE
VIEW2: select ID, NAME, DATE_OF_BIRTH from TABLE

EBR 的好处是它允许同时调用“view1”和“view2”(比如):“MY_VIEW”,并且您可以在数据库中同时运行此视图的多个版本。

于 2022-02-16T04:14:33.320 回答