【问题标题】:Database design for communication records and communication preferences通信记录和通信偏好的数据库设计
【发布时间】:2013-07-09 12:30:09
【问题描述】:

我需要设计一个数据库结构,用于记录特定情况下的客户通信信息和首选通信类型。基本设计将包括

  • 通讯记录:每个客户可能有一个或多个电话号码、地址、电子邮件地址等记录在数据库中。或者他们可能没有任何已定义的记录(例如,他可能有电话号码,但系统中没有定义任何地址)
  • 记录子类型:电话号码可以是线路或 GSM 电话号码。地址可以是家庭或工作地址等。
  • 客户偏好:客户会在某些情况下设置他们首选的通信类型。情况将包括:
    • 发送一次性登录密码(仅限手机)
    • 发送账单信息(可以是手机号码、电子邮件地址或普通地址。)

因此,某些首选项将接受某种通信类型(仅电话号码)或子类型(仅 GSM 电话号码),而有些可能会接受多种类型(地址或电子邮件)

我正在尝试让数据库设计来处理这个问题,它必须是一个优化的结构。

我很难决定结构。为所有具有 type(电话)和 sub-type (GSM) 的通信记录创建一个表将为每条记录包含许多不必要的字段(因为地址将包含像城市和国家这样的数据库字段,而电话记录不会,而它需要数字字段)为每个创建单独的表更好,但是这次我在定义 preferences 表时会遇到问题,因为有些偏好将只接受一个子类型(如 GSM 电话),而有些将接受多个类型(如地址或电子邮件)

满足这种需求的最佳数据库设计方法是什么? DBMS 尚未确定,但可能是 Postgresql 或 Oracle。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    地址需要在单独的表中,因为正如您所说,地址有很多列。如有必要,您可以在地址表中放置一个标志来区分工作地址和家庭地址。

    Address
    -------
    Address ID
    Street
    City
    ...
    

    地址 ID 是一个自动递增的整数或长整数。它是主(集群)键。

    通信记录的其余部分可以放在联系人表中。表格如下所示:

    Contact
    -------
    Contact ID
    Contact Type (Land line phone, email, cell phone, etc.)
    Contact Information
    

    联系人 ID 是一个自动递增的整数或长整数。它是主(集群)键。

    联系信息是包含电子邮件地址或电话号码的 varchar。

    首选项表如下所示:

    Preference
    ----------
    Preference ID
    Preference Order
    Customer ID
    Preference Type (address or contact)
    Address ID
    Contact ID
    

    首选项 ID 是一个自动递增的整数或长整数。它是主(集群)键。

    偏好顺序定义了偏好的顺序。比如先发邮件,再打电话。

    客户 ID 是返回客户表的外键。

    地址 ID 或联系人 ID 将分别是返回地址表或联系人表的外键。

    【讨论】:

    • 不应该Customer ID 必须是ContactAddress 表中的列,否则我如何区分联系人或地址记录的所有者?为了数据一致性,将Record IDPreferences 移动到AddressContact 似乎更好
    【解决方案2】:

    选择一本好的数据模型模式书,例如 Hay、Silverston 或 Fowler 的“分析模式”。

    您希望将电子邮件、电话、邮寄地址和网址抽象为抽象地址类型,以便您可以将单个外键指向任何类型的地址。使用表继承。

    GSM 号码不是电话号码的子类型,因为您应该只对永不改变的事物使用继承,并且某人的电话号码可以从手机移动到固定电话。

    create table address (
      id serial primary key,
      type smallint not null references address_type(id) -- elided
    );
    
    create table address_phone_number (
      id int primary key references address(id),
      phone_number text
    );
    
    /*
    add subtype tables for email, web, mailing...
    */
    
    create table party (
      id serial primary key,
      type int not null references party_type(id), -- elided
      name text not null
    );
    
    create table party_address (
      party_id int not null references party(id),
      address_id int not null references address(id),
      role char(2) not null, -- examples: wf=work fax, ho = home
      primary key party_id, address_id, role)
    );
    

    您可以输入 part_address 来表示 party_address_phone_number 以添加电话分机

    【讨论】:

      猜你喜欢
      • 2013-07-30
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多