【问题标题】:A database design question一个数据库设计问题
【发布时间】:2011-07-10 02:39:21
【问题描述】:

我需要一个具有这种结构的员工表:

雇员(employeeid(int),supervisorids())

supervisorid 只不过是主管的employeeid

一名员工可以有 0 个或多个主管(请注意 0)。如果他有主管,那么我还需要限制这样的员工应该存在于表中……也就是说,它是一个引用特定员工 ID 的内部外键。

我应该如何设计我的表来存储这些信息?如果我将 supervisorids 列设置为 varchar(具有多个主管的employeeid 的分隔值),我无法使用外键来检查该员工是否存在。

谢谢!

编辑:对不起,忘了提一下,“订单”在这里很重要。员工可能有一个主管名单,但他们是按顺序排列的 - 有一个主要主管,如果他缺席,我们就去找第二个主管,然后是第三个,依此类推。

【问题讨论】:

    标签: database-design


    【解决方案1】:

    你为什么不做这样的事情?

    员工表

    ------------------------------------------
    |  id  |   name  |   address  |  etc...  |
    |------|---------|------------|----------|
    |   0  |  Mike   |  blah      |   ...    |
    |------|---------|------------|----------|
    |   1  |  John   |  blah      |   ...    |
    |------|---------|------------|----------|
    | ...  |  ...    |   ...      |   ...    |
    ------------------------------------------
    

    然后是主管表。这两列都可以在员工表中使用外键。

    ------------------------------------------
    |  id  |  employee_id  |  supervisor_id  |
    |------|---------------|-----------------|
    |  0   |     1         |       0         |
    |------|---------------|-----------------|
    |  1   |     1         |       2         |  <---- Employee 1 is managed by 0, 2, and n
    |------|---------------|-----------------|
    |  0   |     0         |       2         |  <----- Employee 0 is managed by 2
    |------|---------------|-----------------|
    |  0   |     1         |       n         |
    ------------------------------------------
    

    等等……

    【讨论】:

    • 迈克,你能澄清一下主管表中的“id”属性是什么吗?
    • 它是对employees表中员工id的外键引用。
    • 那我们为什么需要主管表中的employee_id属性呢?
    • 主管也是员工,所以主管表中的每一行都在说“员工表中ID为{employee_id}的员工由ID为{@的员工监督员工表中的 987654324@}。”
    【解决方案2】:

    这看起来是同一张表的记录之间存在多对多关系的情况(一位主管有多个员工,一位员工有多个主管)。您需要为这种情况添加一个单独的关联表(emp_id、upervisor_id)。这两列都将定义员工表的外键约束

    【讨论】:

    • 谢谢 Fazal,你能看看编辑后的问题吗?
    【解决方案3】:

    您想要类似于 Fazal 推荐的东西:

    您的员工表,以及带有 (employeeid, supervisorid, order) 的单独关联表。 supervisorid 和employeeid 是employee 表的外键,排序键要么是全局唯一的,要么是每个employeeid 唯一的。您的数据库可能会提供更好的方式来进行这样的排序。

    当您需要主管时,您可以在单独的表中查询employeeid,按顺序键排序。

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多