【问题标题】:Assistance with database design协助数据库设计
【发布时间】:2012-03-15 21:29:26
【问题描述】:

我有一个 Excel 表格,其中包含所有曾为我公司工作并仍在为我们工作的员工。这是一张大约 200 行的表格。每行都有基本信息,如姓氏、姓名、职位、资格等。16列基本信息。现在,棘手的部分是这个。在 16 列之后,还有几个月(May-05 到现在 (Apr-12))。在每个月列下,员工要么获​​得 0(合同)、1(永久)、2(合同终止)或 3(学生)。

最好的方法是什么?我在考虑 4 张表(如下所列),其中一张表确定永久终止的人员(为了知道谁从事什么类型的工作)。

MySQL Table: hr_employees
|-----------------|-------|----|----|----|
| employee_number | name  | sur| etc| etc|
|-----------------|-------|----|----|----|
| 1               | Dave  | F  | xx | xx |
|-----------------|-------|----|----|----|

MySQL Table: hr_month
|----|--------|
| id | month  |
|----|--------|
| 1  | May-05 |
| 2  | Jun-05 |
|----|--------|

MySQL Table: hr_status
|----|------|------|--------|
| id | e_no | date | status |
|----|------|------|--------|
| 1  | 1    |  1   |   1    |
| 2  | 1    |  2   |   1    |
|----|------|------|--------|

MySQL Table: hr_terminated
|----|------|
| id | e_no |
|----|------|
| 1  | 1    |
| 2  | 1    |
|----|------|

我希望你们明白我想要达到的目标,否则,问一个问题,我会尽我所能回答! :)

谢谢。

【问题讨论】:

  • 我会使用employee_number等代替id。更容易理解发生了什么。
  • 是的,一旦我得到一个可行的设计,我就会更改名称! :) 还是)感谢你的建议! :)
  • 我更喜欢前缀。 e_id, e_name, e_sur, ...., s_id, s_employee,s_date...等....在 JOIN 中它可以提供帮助。
  • 我现在要更改名称,因为具有相同列名的多个表会使事情变得混乱。我的经验是,使用唯一的列名可以更快地发现问题。

标签: mysql database database-design


【解决方案1】:

这是一种简化数据输入的设计,它更像是关系数据库,而不像 Excel,只要它是规范化的。

MySQL Table: hr_employee
|-----------------|-------|----|----|----| 
| employee_number | name  | sur| etc| etc| 
|-----------------|-------|----|----|----| 
| 1               | Dave  | F  | xx | xx | 
|-----------------|-------|----|----|----| 
| 2               | Bob   | M  | xx | xx | 
|-----------------|-------|----|----|----| 

MySQL Table: hr_employee_status
|-----------------|------------|------------|--------| 
| employee_number | from_date  | to_date    | status | 
|-----------------|------------|------------|--------| 
| 1               | 2005-05-01 | 2005-08-31 |   3    | 
|-----------------|------------|------------|--------| 
| 1               | 2006-05-01 | 2010-02-28 |   0    | 
|-----------------|------------|------------|--------| 
| 2               | 2010-03-01 | 9999-12-31 |   1    | 
|-----------------|------------|------------|--------| 

在这里您可以看到,Dave 从 05 年 5 月到 05 年 8 月被聘为学生,然后在 06 年 5 月作为合同工回来,他一直工作到 2010 年 2 月结束。然后在 2010 年 3 月 1 日,Bob 被聘为正式员工,他仍在工作(最大整理日期的意思是“直至另行通知”)。

这种设计的最大优势在于,您只需在发生变化时输入/编辑数据,而不是您拥有或曾经拥有的每个员工每月一次。您还可以通过非常简单的 SQL 查询查看您的员工在任何给定日期(不仅仅是几个月!)的情况。

【讨论】:

  • 非常感谢。看起来比我想出的要简单得多。并且将其编码为完全符合我的要求将是轻而易举的事。我真的需要开始学习一些数据库设计......你可以推荐任何好的资源吗?
  • @DarkRanger - 我从 C.J. Date 的经典“数据库系统简介”中艰难地学会了它。您可以在 Wikipedia en.wikipedia.org/wiki/Normalization_(database) 上阅读规范化 - 至少阅读时间会更短!在 SO 和 dba.stackexchange.com 上遵循数据库设计标签不会有什么坏处。有很多聪明人在这里就 SO 和 DBA.SE 提供了很好的建议。
  • 谢谢乔尔。我真的很感谢你的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2010-11-11
相关资源
最近更新 更多