【问题标题】:How to Set Customer Table with Multiple Phone Numbers? - Relational Database Design如何设置具有多个电话号码的客户表? - 关系数据库设计
【发布时间】:2011-02-05 12:29:25
【问题描述】:
CREATE TABLE Phone
(
phoneID - PK
.
.
.
);

CREATE TABLE PhoneDetail
(
phoneDetailID - PK
phoneID - FK points to Phone
phoneTypeID ...
phoneNumber ...
.
.
.
);

CREATE TABLE Customer
(
customerID - PK
firstName
phoneID - Unique FK points to Phone
.
.
.
);

一个客户可以有多个电话号码,例如细胞、工作等 Customer 表中的 phoneID 是唯一的,并且指向 Phone 表中的 PhoneID。 如果客户记录被删除,Phone表中的phoneID也应该被删除。

您对我的设计有任何顾虑吗?这设计得当吗?我的问题是 Customer 表中的 phoneID 是一个孩子,如果删除了孩子记录,那么我 无法自动删除父(电话)记录。

【问题讨论】:

    标签: sql database database-design database-normalization


    【解决方案1】:

    我认为你过度设计了它。我认为单独的 Phone + PhoneDetail 表没有用。通常有两种实用的方法。

    1) 简单性 - 将所有电话放入客户记录本身。是的,它违反了规范化规则,但它在实践中非常简单,通常只要您提供(工作、家庭、移动、传真、紧急情况)就可以工作。好处是代码很简单,实现时间更短。检索具有客户记录的所有电话很简单,使用特定类型的电话 (Customer.Fax) 也是如此。

    缺点:稍后添加其他电话类型有点痛苦,而且搜索电话号码也很麻烦。你必须编写像"select * from customer where cell = ? or home = ? or work = ? or emergency = ?" 这样的SQL。预先评估您的设计。如果存在这些问题中的任何一个问题,或者您不知道是否存在问题,请使用标准化方法。

    2) 可扩展性 - 走你要走的路。电话类型可以稍后添加,无需更改 DDL。客户 -> 客户电话

    Customer (
       customerId
    )
    
    CustomerPhone (
       customerId references Customer(customerId)
       phoneType references PhoneTypes(phoneTypeId)
       phoneNumber
    )
    
    PhoneTypes (
       phoneTypeId   (H, W, M, F, etc.)
       phoneTypeDescription
    )
    

    【讨论】:

    • 1.第二种方法的优点是不限制客户可以拥有的电话号码数量。 2.这比OP的设计要好,因为它少了一张桌子-在OP的设计中不需要PhonePhoneDetails
    【解决方案2】:

    由于 mrjoltcola 已经解决了规范化问题,我将解决在电话中有记录但没有电话详细信息记录的问题。

    如果这是您唯一的问题,那么有三种方法:

    1) 不要从明细表中删除,而是使用 CASCADE DELETE 从手机中删除 - 使用单个 SQL 语句从两个表中删除并保持数据一致

    2) 在详细表上有触发器,当父级的最后一条记录从子级中删除时会自动删除父级(这不会很好,并且会减慢表上的所有删除速度。而且很丑。仍然有可能做到)

    3) 在应用程序的业务逻辑层执行此操作 - 如果该层被正确分离并且用户(应用程序)将仅通过该层修改数据,您可能会达到所需的一致性保证水平

    【讨论】:

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