数据库:在增量表的单个 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。
- 比较差异。更新差异给第三方。
- 更新以上 table 更新值和最后更新日期。
哪一个被认为是最好的方法,单一 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 和 type
和 value
列。它看起来很有吸引力,因为它意味着我们可以在没有任何进一步 DDL 的情况下跟踪其他实体。但实际上,我们添加的每个属性在任何给定时间 re-assemble Employee 的完整状态 变得更加困难。这也意味着审计过程本身更复杂(因为它需要确定哪些属性已更改以及是否需要审计更改)并且更昂贵(因为在同一记录上更改三个属性需要插入三个审计记录)。
使用 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。
- 比较差异。更新差异给第三方。
- 更新以上 table 更新值和最后更新日期。
哪一个被认为是最好的方法,单一 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 和 type
和 value
列。它看起来很有吸引力,因为它意味着我们可以在没有任何进一步 DDL 的情况下跟踪其他实体。但实际上,我们添加的每个属性在任何给定时间 re-assemble Employee 的完整状态 变得更加困难。这也意味着审计过程本身更复杂(因为它需要确定哪些属性已更改以及是否需要审计更改)并且更昂贵(因为在同一记录上更改三个属性需要插入三个审计记录)。