使用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名员工。
良好的数据库设计为不同的概念提供了单独的表。使用相同的数据库列来保存不同类型的数据将导致代码更难理解,容易导致数据损坏并且性能降低。
您可能会认为它只有两个表和成千上万的行,所以这有关系吗?但这只是您当前的要求。您现在选择的内容将为需要(在此过程中)添加电话号码的情况设置模板。
现在如果将来还有5个实体需要更新,则现在>]
[您是说“实体”,例如说客户而不是员工吗?还是在我的员工电话号码示例中,您真的是说“属性”吗?
通常来说,我们为不同的实体提供了一个单独的表,并且该实体的所有属性都以相同的基数分组。以您的示例为例,我希望一名员工拥有一个用户ID和一个电子邮件地址,因此我将这样设计表:
Employee_audit EmpId|UserID|EmailID|Updatedate
即,我有一个记录,它在
Updatedate
中存储Employee记录的完整状态。
[如果我们添加一个新实体,客户,那么我们会有一个新表。简单。但是,像电话号码这样的新属性提供了一个选择,因为员工可以拥有多个:工作座机,移动电话,传真,家庭等。因此,我们可以用三种方式来表示:带有类型列的子表,多个子表每种类型的表格,或作为Employee记录上不同的列。对于主要的Employee表,我将选择单独的表(或多个表,这取决于我是否要拍摄6NF)。
但是对于审计表,我将为每个员工选择一条记录,并按如下所示设置电话号码:
变得更加困难。同样,这也意味着审核过程本身更加复杂(因为它需要确定哪些属性已更改以及是否需要审核更改)并且更加昂贵(因为更改同一记录上的三个属性需要插入三个审核记录)。Employee_audit EmpId|UserID|EmailID|Landline|Mobile|Fax|Home|Updatedate
我永远不会做的一件事就是只有一个带有
type
和value
列的表。这似乎很有吸引力,因为它意味着我们可以跟踪其他实体,而无需任何其他DDL。但是实际上,在任何给定时间使用我们添加的每个属性来重新组合Employee的完整状态