【问题标题】:table design issue for normalizing multiple catogories sharing similar data用于标准化共享相似数据的多个类别的表设计问题
【发布时间】:2014-06-06 09:14:22
【问题描述】:

我对表格设计有点困惑。

方法 1) 使用第一种方法,我可以从 phone_book 表中选择所有电话号码,并通过指定类型过滤掉员工电话号码。 方法2)在第二种方法中,我可以通过加入两个表来选择全部,并且可以检索员工电话号码。

我对地址也有同样的问题。我有员工、客户、员工和其他人的地址。我已经用谷歌搜索了,但仍然无法选择哪种方法是正确的。哪种方法是正确的,为什么另一种方法不正确,还有其他更好的设计?

方法一

employee
id | name 
1      e


customer
id | name
1     c


phone_book
type | fk_id |     phone
  e      1         123123123
  c      1         451323123

方法二

employee
id | name 
1      e


customer
id | name
1     c


employee_phone_book
emp_id  |     phone
   1         1231233434
   2         6273343423


customer_phone_book
cus_id  |  phone
   1       5231233434
   2       1251233434

编辑: 员工和客户可以有多个电话号码。与地址详细信息相同。

【问题讨论】:

    标签: sql database normalization


    【解决方案1】:
    employee
    id | name | phone_id
    1      e    1
    
    
    customer
    id | name | phone_id
    1     c     2
    
    
    phone_book
    phone_id |     phone
    1         123123123
    2         451323123
    

    对我来说,电话的引用应该在 employeecustomer 表中(FK 到 phone_book 表)

    更新:如果客户/员工可能有多个电话,最好通过附加表定义多对多关系,例如

    customer_phone 
    phone_id |     customer_id (reference to the customer table)
    1              1
    2              1
    

    【讨论】:

    • 很抱歉忘记提及员工和客户可以有多个电话号码。与地址详细信息相同。
    【解决方案2】:

    如果员工和客户有多个电话号码,那么您的 phone_book 应该如下所示。您需要创建一对多关系表结构。

    phone_book
    phone_id | EmpOrCustomer | EmpOrCustomerId | phone
    1          1               1                  123123123
    2          1               1                  45132XXXX
    3          2               4                  45132XXXX
    

    在上面的表格结构中,您可以添加两个额外的列,告诉您它的员工或客户,另一个告诉您员工或客户 ID 是什么。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 2019-06-27
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多