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

问题描述 投票:0回答:1

使用Java和Oracle。

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

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

仅单个表:

EmployeeiD|Value|Type|UpdateDate 

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

多表:

 Employee_EmailID
      EmpId|EmailID|Updatedate

 Employee_UserID
      EmpId|UserID|Updatedate

Java流将为:-从实际表中选择员工。-从中间表上方选择员工。-比较差异。更新差异给第三方。-使用更新的值和最后更新日期更新上表。

哪种方法被认为是最好的方法,单表方法还是多表方法,或者有什么标准方法可以实现相同的方法?系统中有10,000名员工。

oracle database-design data-modeling create-table audit-trail
1个回答
2
投票

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

您可能会认为它只有两个表和成千上万的行,所以这有关系吗?但这只是您当前的要求。您现在选择的内容将为需要(在此过程中)添加电话号码的情况设置模板。


现在如果将来还有5个实体需要更新,则现在>]

[您是说“实体”,例如说客户而不是员工吗?还是在我的员工电话号码示例中,您真的是说“属性”吗?

通常来说,我们为不同的实体提供了一个单独的表,并且该实体的所有属性都以相同的基数分组。以您的示例为例,我希望一名员工拥有一个用户ID和一个电子邮件地址,因此我将这样设计表:

Employee_audit
      EmpId|UserID|EmailID|Updatedate

即,我有一个记录,它在Updatedate中存储Employee记录的完整状态。

[如果我们添加一个新实体,客户,那么我们会有一个新表。简单。但是,像电话号码这样的新属性提供了一个选择,因为员工可以拥有多个:工作座机,移动电话,传真,家庭等。因此,我们可以用三种方式来表示:带有类型列的子表,多个子表每种类型的表格,或作为Employee记录上不同的列。对于主要的Employee表,我将选择单独的表(或多个表,这取决于我是否要拍摄6NF)。

但是对于审计表,我将为每个员工选择一条记录,并按如下所示设置电话号码:

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

我永远不会做的一件事就是只有一个带有typevalue列的表。这似乎很有吸引力,因为它意味着我们可以跟踪其他实体,而无需任何其他DDL。但是实际上,在任何给定时间使用我们添加的每个属性来重新组合Employee的完整状态

变得更加困难。同样,这也意味着审核过程本身更加复杂(因为它需要确定哪些属性已更改以及是否需要审核更改)并且更加昂贵(因为更改同一记录上的三个属性需要插入三个审核记录)。
© www.soinside.com 2019 - 2024. All rights reserved.