2013-10-28 40 views
6

我有一個數據庫與表「人」,「公司」,「商店」等。這些表中的許多表必須有「聯繫信息」。在Database design - Similar Contact Information for multiple entities 現在,在我的數據庫我有可能有多個地址,多個電話和多個電子郵件到每個聯繫人數據。這是我的數據庫架構:數據庫設計 - 多個「聯繫信息」爲不同表

database contact information

所以,我做一箇中間表「接觸」作爲鏈接「接觸信息」每個表最簡單的方法。
我的問題:這是一個很好的做法,做到這一點,並有一個表只有一行?

回答

3

我的問題:這是一個很好的做法,並有一個只有一行的表?

不是真的。看看你的圖表,我必須問:聯繫人是否真的可以與任意數量的人聯繫在一起?如果沒有,你應該使用'person'作爲父表,並且讓其他錶鏈接到它。

+0

其實是的,我可以有一個千人,企業和商店。如果我理解得很清楚你的建議,我必須直接將電子郵件,電話和地址鏈接到我的所有實體(人員,公司,商店)?所以我會有這樣的: '電子郵件 - > idemail,郵件,idperson,idcompany,idshop' 它真的更好嗎? –

+1

不,在你的情況下,你應該使用下面Benny Hill建議的關聯表。否則可以做,但確保數據保持一致將是非常煩人的,不值得。 – AurelienT

+0

也鏈接國家來解決不到城市,因爲可能有不同國家和/或州/省/縣同名的城市 – AquaAlex

7

這是我會怎麼設計數據庫:

address_types 
    id    unsigned int(P) 
    description  varchar(10) // Mailing, Physical, etc. 

addresses 
    id    unsigned int(P) 
    line1   varchar(50) // 123 Main Street, etc. 
    line2   varchar(50) // Default NULL 
    city_id   unsigned int(F cities.id) 
    zip    varchar(6) // 12345, A1A 1A1, etc. 
    zip4   char(4) // Default NULL 
    lat    decimal(10,8) // 13.12345678, etc. 
    lon    decimal(11,8) // 110.12345678, etc. 

cities 
    id    unsigned int(P) 
    state_id  unsigned int(F states.id) 
    name   varchar(50) // Omaha, Detroit, Tampa, etc. 

companies 
    id    unsigned int(P) 
    name   varchar(75) // IBM, Microsoft, RedHat, etc. 
    ... 

companies_addresses 
    id     unsigned int(P) 
    company_id   unsigned int(F companies.id) 
    address_id   unsigned int(F addresses.id) 
    address_type_id  unsigned int(F address_types.id) 

companies_contacts 
    id     unsigned int(P) 
    company_id   unsigned int(F companies.id) 
    contact_id   unsigned int(F contacts.id) 
    contact_type_id  unsigned int(F contact_types.id) 

companies_emails 
    id     unsigned int(P) 
    company_id   unsigned int(F companies.id) 
    email_id   unsigned int(F emails.id) 
    email_type_id  unsigned int(F email_types.id) 

contact_types 
    id    unsigned int(P) 
    description  varchar(10) // Home phone, Mobile phone, FAX, etc. 

在北美地區的電話號碼如下所示:CC-AAA-EEE-SSSS-XXXXXXX,其中CC是國家代碼,AAA是區號,EEE是交易所,SSSS是電臺,XXXXX是延伸。

contacts 
    id    unsigned int(P) 
    country_code varchar(3) 
    area_code  varchar(3) 
    exchange  varchar(3) 
    station   varchar(4) 
    extension  varchar(10) // Default NULL 

請參閱ISO 3166-1

countries 
    id    char(2) // ca, mx, us, etc. 
    iso3   char(3) // can, mex, usa, etc. 
    iso_num   char(3) 
    name   varchar(44) // Canada, Mexico, United States, etc. 

email_types 
    id    unsigned int(P) 
    description  varchar(10) // Personal, Work, etc. 

emails 
    id    unsigned int(P) 
    address   varchar(255) // [email protected], etc. 

shops 
    id    unsigned int(P) 
    name   varchar(45) // Shop A, Shop B, etc. 
    ... 

shops_addresses 
    id     unsigned int(P) 
    shop_id    unsigned int(F shops.id) 
    address_id   unsigned int(F addresses.id) 
    address_type_id  unsigned int(F address_types.id) 

shops_contacts 
    id     unsigned int(P) 
    shop_id    unsigned int(F shops.id) 
    contact_id   unsigned int(F contacts.id) 
    contact_type_id  unsigned int(F contact_types.id) 

shops_emails 
    id      unsigned int(P) 
    shop_id     unsigned int(F shops.id) 
    email_id    unsigned int(F emails.id) 
    email_type_id   unsigned int(F email_types.id) 

參見ISO 3166-2

states 
    id    unsigned int(P) 
    country_id  char(2)(F countries.id) 
    code   varchar(2) // AL, NF, NL, etc. 
    name   varchar(50) // Alabama, Newfoundland, Nuevo León, etc. 
+0

好的,我明白了你的觀點。你提出了相同的解決方案,在這裏http://stackoverflow.com/questions/3636061/database-design-similar-contact-information-for-multiple-entities(方法1)。但這裏也有一個相同的缺點 - 「創建大量關聯表」。還有另一種方法可以做到這一點? –

+2

這不是一個缺點,規範化是一件好事。只要您正確地編制索引,RDBMS就擅長連接表。 –

+0

我知道這是2歲,但我想知道你的想法是把'email_type_id'放在每個'XXXX_emails'表上,而不是把它放在'email'表上,因爲每封電子郵件都有一個類型。我設計的是類似的設計,並採用與您類似的設計(除了不會將電話號碼分成許多列),不同之處在於我要將email_type_id放在電子郵件表格中。 – kralco626

2

個人意見,我不喜歡這種方法,因爲我們需要爲每個表和許多關聯表創建任何實體。我提出了一個聯繫信息表和另一個地址表。

informations 
- id INT 
- name VARCHAR 
- value VARCHAR 
- type ENUM(phone, email, url, custom) 
- idcompany INT NULL 
- idcontact INT NULL 

而且

addresses 
- id 
- address1 
- address2 
- district 
- postcode 
- idcity 
- idcompany 
- idcontact