【问题标题】:Employee table (Master and detail table)员工表(主表和明细表)
【发布时间】:2012-06-20 09:12:36
【问题描述】:

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

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

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

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

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

选项:新

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

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

【问题讨论】:

    标签: sql-server oracle database-design schema history


    【解决方案1】:

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

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

    选项 - 2 和选项 1 的改进

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

    【讨论】:

    • 能否提供一个非规范化表的简单示例?
    • 是的。新表将包含组名称、经理名称、角色名称,而不是组 ID、经理 ID、角色 ID。通过这种方式,您可以在报告期间摆脱 Join。
    • 所以我将拥有三个表 Master、Details 和 Denormalize 一个?
    • @user63981 - 是的。 De-Normalized 表将仅用于报告的情况,以便快速访问报告数据。我忘了告诉你一件事。请查看我的point 5 option 3
    • 我只是想它可能会变得复杂,因为例如,如果在 de normalize 表中有一个员工 (EmpCode='UK007') 的两个条目,一个具有部门代码 '023' 和其他记录在更新后具有 deptCode = '024'。
      在时间表表中,该员工 'UK007' 的五个条目具有不同的 deptCode,我想在 EmpCode = 'UK007 的时间表表上运行报告' 和部门代码 = '023'。如果时间表表中没有部门代码,系统将如何过滤我的条件中的行?
    【解决方案2】:

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

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

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


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

    【讨论】:

    • 是的,这些列可以更改,但在跟踪历史记录中不需要。
    • 坦率地说这看起来很奇怪,但我想没有考虑到业务逻辑!
    • 这不是人力资源数据库,我们只是在一定程度上保存员工详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2012-03-23
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多