1

我想知道是否可以为员工提供主表和明细表?

根据要求,数据可以按部门按国家和员工代码在报告级别进行过滤。

如果员工的部门或国家代码发生更改,则更改将进入明细表,旧记录将设置为 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

员工表将与时间表表链接,对于时间表报告,数据可以按部门、国家和员工代码进行过滤。

选项:我

  • 拥有一个具有一个主键的员工表,并在为员工更新部门或角色时创建一个新条目。
  • 在时间表表中添加国家和部门代码。

--> 这样我就不需要搜索员工表了。

选项:二

  • 有主表和明细表。
  • 在时间表表中添加国家和部门代码。

--> 这样我就不需要搜索员工表,而且我会有主从表

选项:新

  • 有主表和明细表。
  • 时间表表将有 EmpCode。
  • 如果用户移动到新位置更改部门,则在明细表中插入一个新行,其中包含新的部门代码和相同的员工编号。
  • 更新旧行并设置结束日期字段,因此如果他更改他的位置或部门,则需要更新结束日期字段。

哪一个是最好的选择,还有其他更好的选择吗?

4

2 回答 2

3

这是实现此要求的一种方法,也是许多人采用的方法。但是,它有一个主要缺点:每次查询当前员工状态时,都需要过滤开始和结束日期的详细信息。这似乎是一件微不足道的事情,但你不会相信它会引起多少混乱,而且它也对性能有影响。

这些事情很重要,因为大多数时候您只需要当前的详细信息,而对历史的查询相对罕见。因此,您阻碍了最常见用例的实现,以便更容易实现较少使用的用例。(当然,我正在对您的业务需求做出假设,也许您的不是普通的员工应用程序......)

更好的解决方案是有两个表,一个包含所有详细信息列的 EMPLOYEES 表和一个包含相同列以及开始和结束日期的 EMPLOYEES_HISTORY 表。当您更改员工的记录时,可能通过触发器在历史表中插入旧记录的副本。您的标准流程只有一张表可供查询,您的历史记录需求得到充分满足。


顺便说一句,您提出的数据模型是错误的。Working_hours、email_address 和 last_name 绝对是可以改变的东西,甚至可能是名字(例如,通过个人情况的改变,比如结婚)。因此,所有这些列都应保存在您的详细信息名称中

于 2012-06-18T12:18:22.163 回答
1

选项 3 - 请注意,此选项仅对报告观点有用。

  1. 每当您插入数据时,请De-Normalized在新表中创建一个条目。
  2. 每当更新条目时,该De-Normalized条目将在新表中更新。
  3. 新表将包含De-NormalizedEmployee 的所有列。
  4. 因此,在执行搜索时,这将使您受益,因为结果将在不使用Joins. 因此,访问时间将减少。
  5. 新表中的记录将在插入/更新触发器中创建/更新。

选项 - 2 和选项 1 的改进

不要通过添加重复列来创建冗余。

于 2012-06-18T15:57:24.807 回答