2013-07-09 26 views
1

我需要設計一個DB結構,以保留客戶通信信息記錄和某些情況下的首選通信類型。基本設計包括用於通信記錄和通信偏好的數據庫設計

  • 通訊記錄:每個客戶可以有一個或多個電話號碼,地址,電子郵件地址等記錄在數據庫中。或者他們可能沒有任何定義的記錄(如他可能有一個電話號碼,但沒有在系統中定義的任何地址)
  • 記錄子類型:電話號碼可以是一行或一個GSM電話號碼。地址可以是家庭或工作地址等
  • 客戶的喜好:客戶將設置通信的他們的首選類型的一些情況。情況包括:
    • 發送單使用的登錄密碼(隻手機)
    • 發送計費信息(可以是手機號碼,電子郵件地址或普通地址。)

因此,有些偏好設置會接受某種通訊類型(僅限電話號碼)或子類型(僅限GSM電話號碼),而有些可能會接受多種類型(地址或電子郵件)

我正試圖使數據庫設計來處理這個和我t必須是一個優化的結構。

我有關於決定的結構很難。創建一個表用於具有(電話)和分型(GSM)將有許多unnecesarry欄的所有記錄(因爲一個地址將包含類似城市和國家數據庫領域的所有通訊記錄,而電話記錄不會,雖然它需要號碼字段)爲每個創建單獨的表是更好的,但是這次我會在定義首選項表時遇到問題,因爲一些首選項只會接受一個子類型(如GSM電話),而有些會接受一種以上類型(如地址或電子郵件)

什麼將成爲這樣一個需要最好的數據庫設計方法? DBMS尚未確定,但可能是Postgresql或Oracle。

回答

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分別是返回到地址表或聯繫人表的外鍵。

+0

不應該'客戶ID'必須是列和'Address'表,否則我怎麼會不同所有者聯繫人或地址記錄?爲了保持數據的一致性,將'Record ID'形成'Preferences'到'Address'和'Contact'似乎更好 – FallenAngel

0

拿起一個很好的數據模型模式書,比如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添加兩個`Contact`電話分機