1

我需要设计一个数据库结构,在某些情况下保留客户通信信息和首选通信类型的记录。基本设计将包括

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

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

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

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

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

4

2 回答 2

0

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

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 将分别是返回地址表或联系人表的外键。

于 2013-07-09T12:44:31.507 回答
0

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

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

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-09T19:43:05.457 回答