数据库:在增量表的单个 table 或多个中间 table 中存储多个类型

Database: Storing multiple Types in single table or multiple intermediate tables for Delta Tables

使用 Java 和 Oracle。

我们需要将员工的电子邮件、UserID 中的更改更新给第三方。 实际 table 是我们保留的员工和中间人 table,我们将在发送给第三方之前将其用于比较更改。

以下是针对中级 table 的数据库设计:

只有单身table:

EmployeeiD|Value|Type|UpdateDate 

Value 是用户 ID 或电子邮件,type 将是 'email''userid'。保留更新日期以便找出电子邮件或用户 ID 中的哪一个不同并更新给第三方。

多个Table:

 Employee_EmailID
      EmpId|EmailID|Updatedate

 Employee_UserID
      EmpId|UserID|Updatedate

Java 流量将为:

哪一个被认为是最好的方法,单一 table 方法还是多个 table 方法,或者是否有任何标准方法来实现相同的方法?系统中有 10,000 名员工。

中级 table 只是存储 Delta 记录,即传输给第三方的记录,以便第二天进行比较。

好的数据库设计对不同的概念有单独的 table。使用相同的数据库列来保存不同类型的数据将导致代码更难理解、容易发生数据损坏和性能下降。

你可能认为只有两个table,几万行,这有关系吗?但这只是您当前的要求。您现在选择的内容将为(比如说)您需要向流程中添加电话 phone 号码时发生的情况设置模板。


Now in future if we get 5 more entities to update

您是说 "entities",比如客户而不是员工?或者您的意思是 "attributes",就像我的员工电话 phone 号码示例中那样?

一般来说,我们有一个单独的 table 用于不同的实体,并且该实体的所有属性都按相同的基数分组。举个例子,我希望一名员工有一个用户 ID 和一个电子邮件地址,所以我会这样设计 table:

Employee_audit
      EmpId|UserID|EmailID|Updatedate

也就是说,我有一条记录,它在 Updatedate 处存储了 Employee 记录的完整状态。

如果我们添加一个新实体 Customers,那么我们就会有一个新的 table。简单的。但是像 Employee Phone Number 这样的新属性提供了一个选择,因为一个员工可以拥有多个:工作固定电话、手机、传真、家庭等。所以我们可以用三种方式表示:a child table 带有一个类型列,每个类型有多个 child table,或者作为 Employee 记录上的不同列。

对于主要员工 table,我会选择单独的 table(或 tables,具体取决于我是否为 6NF 拍摄)。但是对于审计 table 我会为每个员工选择一条记录并像这样旋转 phone 数字:

Employee_audit
      EmpId|UserID|EmailID|Landline|Mobile|Fax|Home|Updatedate

我永远不会做的一件事是拥有一个 table 和 typevalue 列。它看起来很有吸引力,因为它意味着我们可以在没有任何进一步 DDL 的情况下跟踪其他实体。但实际上,我们添加的每个属性在任何给定时间 re-assemble Employee 的完整状态 变得更加困难。这也意味着审计过程本身更复杂(因为它需要确定哪些属性已更改以及是否需要审计更改)并且更昂贵(因为在同一记录上更改三个属性需要插入三个审计记录)。