首页 > 解决方案 > 数据库:将多个类型存储在单个表中或增量表的多个中间表中

问题描述

使用 Java 和 Oracle。

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

以下是中间表的数据库设计:

只有单表:

EmployeeiD|Value|Type|UpdateDate 

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

多表:

 Employee_EmailID
      EmpId|EmailID|Updatedate

 Employee_UserID
      EmpId|UserID|Updatedate

Java 流程将是:

哪一个被认为是最好的方法,单表方法或多表,或者有没有标准的方法来实现?系统中有 10,000 名员工。

中间表只是存储增量记录,即转移给第三方的记录,以便第二天进行比较。

标签: oracledatabase-designdata-modelingcreate-tableaudit-trail

解决方案


良好的数据库设计为不同的概念提供单独的表。使用相同的数据库列来保存不同类型的数据将导致代码更难理解,容易出现数据损坏和性能下降。

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


现在将来如果我们再更新 5 个实体

你的意思是“实体”,比如说客户而不是员工?或者您真的是指我的员工电话号码示例中的“属性”?

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

Employee_audit
      EmpId|UserID|EmailID|Updatedate

也就是说,我有一个记录,它将 Employee 记录的完整状态存储在Updatedate.

如果我们添加一个新实体,客户,那么我们就有一个新表。简单的。但是像员工电话号码这样的新属性提供了一个选择,因为员工可以有多个:工作座机、手机、传真、家庭等。所以我们可以用三种方式表示它:具有类型列的子表、多个每个类型的子表,或作为员工记录上的不同列。

对于主 Employee 表,我会选择单独的表(或表,取决于我是否为 6NF 拍摄)。但是对于审计表,我会为每个员工选择一条记录,然后像这样旋转电话号码:

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

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


推荐阅读