Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 通信记录和通信首选项的数据库设计_Database_Database Design - Fatal编程技术网

Database 通信记录和通信首选项的数据库设计

Database 通信记录和通信首选项的数据库设计,database,database-design,Database,Database Design,我需要设计一个数据库结构,它将记录客户通信信息和特定情况下的首选通信类型。基本设计包括 通信记录:每个客户可能有一个或多个电话号码、地址、电子邮件地址等记录在数据库中。或者,他们可能没有为某些情况定义任何记录,比如他可能有电话号码,但在系统中没有定义任何地址 记录子类型:电话号码可以是线路或GSM电话号码。地址可以是家庭或工作地址等。 客户偏好:客户将在某些情况下设置其首选的通信类型。情况将包括: 仅发送手机登录的单一使用密码 发送账单信息可以是手机号码、电子邮件地址或普通地址。 因此,一些首选

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

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

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

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


对于这样的需求,最好的数据库设计方法是什么?DBMS尚未确定,但它可能是Postgresql或Oracle。

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

Address
-------
Address ID
Street
City
...
地址ID是一个自动递增的整数或长整数。它是主要的集群密钥

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

Contact
-------
Contact ID
Contact Type (Land line phone, email, cell phone, etc.)
Contact Information
Preference
----------
Preference ID
Preference Order
Customer ID
Preference Type (address or contact)
Address ID
Contact ID
联系人ID是一个自动递增的整数或长整数。它是主要的集群密钥

联系人信息是保存电子邮件地址或电话号码的varchar

首选项表如下所示:

Contact
-------
Contact ID
Contact Type (Land line phone, email, cell phone, etc.)
Contact Information
Preference
----------
Preference ID
Preference Order
Customer ID
Preference Type (address or contact)
Address ID
Contact ID
首选项ID是一个自动递增的整数或长整数。它是主要的集群密钥

首选项顺序定义了首选项的顺序。例如,先发电子邮件,然后打电话

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


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

选择一本好的数据模型模式手册,如Hay、Silverston或Fowler的分析模式

您希望将电子邮件、电话、邮寄地址和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以添加电话分机

联系人和地址表中的Customer ID不应该都是列,否则如何区分联系人或地址记录的所有者?为了数据一致性,将记录ID表单首选项移动到地址和联系人似乎更好