我想知道是否可以为员工提供主表和详细信息表?
根据要求,数据可以按国家/地区和报告级别的员工代码进行过滤。
如果更改了员工的部门或国家/地区代码,则更改将进入详细信息表,旧记录将设置为IS_ACTIVE ='T'。
---------------------主表------------------------ --------------
**EMPLOYEE_CODE** VARCHAR2(20 BYTE) NOT NULL,
EMAIL VARCHAR2(100 BYTE)
FIRST_NAME VARCHAR2(50 BYTE)
LAST_NAME VARCHAR2(50 BYTE)
WORKING_HOURS NUMBER
---------------------详情表------------------------ --------------
**PK_USER_DETAIL_ID** NUMBER,
FK_EMPLOYEE_CODE VARCHAR2(20 BYTE),
FK_GROUP NUMBER,
FK_DEPARTMENT_CODE NUMBER,
FK_EMPLOYER_COUNTRY_CODE VARCHAR2(5 BYTE),
FK_MANAGER_ID VARCHAR2(20 BYTE),
FK_ROLE_CODE VARCHAR2(6 BYTE),
START_DATE DATE,
END_DATE DATE,
IS_ACTIVE VARCHAR2(1 BYTE),
INACTIVE_DATE DATE
员工表将与时间表表链接,对于时间表报表,数据可按部门,国家和员工代码进行过滤。
选项:我
- >这样我就不需要搜索员工表了。
选项:II
- >这样我就不需要搜索员工表了,我将拥有主详细信息表
选项:新
哪一个是最佳选择,还有其他更好的选择吗?
答案 0 :(得分:3)
这是实现此要求的一种方式,这是许多人采用的方法。但是,它有一个主要的缺点:每次查询当前员工状态时,您需要过滤开始和结束日期的详细信息。这似乎是一件微不足道的事情,但你不会相信它会造成多大的混乱,而且它也会产生性能影响。
这些事情很重要,因为大多数时候你只想要当前的细节,对历史的查询是相对罕见的。因此,您正在阻碍最常见用例的实现,以便更容易实现较少使用的用例。 (当然,我正在对您的业务需求做出假设,也许您的工作不是普通的员工申请......)
更好的解决方案是拥有两个表,一个包含所有详细信息列的EMPLOYEES表和一个包含相同列以及开始和结束日期的EMPLOYEES_HISTORY表。当您更改员工的记录时,可能会通过触发器在历史记录表中插入旧记录的副本。您的标准流程只有一个表可供查询,并且您的历史记录需求得到了充分满足。
顺便提一下,您建议的数据模型是错误的。 Working_hours,email_address和last_name绝对是可以改变的东西,甚至可能是名字(例如通过结婚等个人情况的变化)。因此,所有这些列都应保存在您的详细信息名称中
答案 1 :(得分:1)
De-Normalized
条目。 De-Normalized
条目都会在新表中更新。De-Normalized
列。Joins
的情况下计算。因此,访问时间将减少。不要通过添加重复列来创建冗余。