oracle - 数据库:将多个类型存储在单个表中或增量表的多个中间表中
问题描述
使用 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 名员工。
中间表只是存储增量记录,即转移给第三方的记录,以便第二天进行比较。
解决方案
良好的数据库设计为不同的概念提供单独的表。使用相同的数据库列来保存不同类型的数据将导致代码更难理解,容易出现数据损坏和性能下降。
你可能认为只有两张表,几万行,这有关系吗?但这只是您当前的要求。您现在选择的内容将为(例如)您需要将电话号码添加到流程中时发生的情况设置模板。
现在将来如果我们再更新 5 个实体
你的意思是“实体”,比如说客户而不是员工?或者您真的是指我的员工电话号码示例中的“属性”?
一般来说,对于不同的实体,我们有一个单独的表,并且该实体的所有属性都以相同的基数分组。举个例子,我希望一个员工有一个用户 ID 和一个电子邮件地址,所以我会设计这样的表格:
Employee_audit
EmpId|UserID|EmailID|Updatedate
也就是说,我有一个记录,它将 Employee 记录的完整状态存储在Updatedate
.
如果我们添加一个新实体,客户,那么我们就有一个新表。简单的。但是像员工电话号码这样的新属性提供了一个选择,因为员工可以有多个:工作座机、手机、传真、家庭等。所以我们可以用三种方式表示它:具有类型列的子表、多个每个类型的子表,或作为员工记录上的不同列。
对于主 Employee 表,我会选择单独的表(或表,取决于我是否为 6NF 拍摄)。但是对于审计表,我会为每个员工选择一条记录,然后像这样旋转电话号码:
Employee_audit
EmpId|UserID|EmailID|Landline|Mobile|Fax|Home|Updatedate
我永远不会做的一件事是有一个带有type
和value
列的表。这似乎很有吸引力,因为这意味着我们可以在没有任何进一步 DDL 的情况下跟踪其他实体。但事实上,在任何给定时间用我们添加的每个属性重新组装Employee的完整状态变得更加困难。这也意味着审计过程本身更复杂(因为它需要确定哪些属性已更改以及是否需要审计更改)并且成本更高(因为更改同一记录上的三个属性需要插入三个审计记录)。
推荐阅读
- windows - StartScreenCapturebyWindowId() 不排除某些程序的重叠窗口(Agora Unity)
- sql-server - 使用 Management Studio 在 SQL Server 2012 中的同一服务器中以不同名称恢复正在运行的数据库
- c++ - 为可变大小的链表动态创建节点
- r - 循环左连接
- macos - Mac OS Catalina (10.15.6) X 本地主机上的 403 禁止错误
- plotly - Plotly:在回调清单之前提交按钮?
- python - 将两个数据框中的两列与另一列的条件进行比较
- javascript - 如何以开玩笑的方式进行测试
- git - Git过滤器分支多个文件重写
- c - C中的信号()函数无法正常工作