我有一个包含"person"、"company"、"shop"等表的数据库。这些表中很多都需要有"联系信息"。在数据库设计 - 多个实体的相似联系信息中要求设计这一功能。
现在,在我的数据库中,每个联系数据都可以拥有多个地址、电话和电子邮件。这是我的数据库模式:
所以,我创建了一个中间表"contact",作为将"联系信息"链接到每个表的最简单方法。
我的问题是:这样做并且拥有只有一行的表是一个好的实践吗?
我有一个包含"person"、"company"、"shop"等表的数据库。这些表中很多都需要有"联系信息"。在数据库设计 - 多个实体的相似联系信息中要求设计这一功能。
现在,在我的数据库中,每个联系数据都可以拥有多个地址、电话和电子邮件。这是我的数据库模式:
所以,我创建了一个中间表"contact",作为将"联系信息"链接到每个表的最简单方法。
我的问题是:这样做并且拥有只有一行的表是一个好的实践吗?
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代表站点号,XXXXXX代表分机号。
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) // support@ibm.com, 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)
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.
XXXX_emails
表上放置email_type_id
而不是放在email
表上的想法是什么,因为每封电子邮件都会有一个类型。我正在设计类似的东西,并且得出了与你类似的设计(除了没有将电话号码拆分成那么多列),只是我打算将email_type_id
放在电子邮件表上。 - kralco626email -> idemail, mail, idperson, idcompany, idshop
这真的更好吗? - nb.ag个人而言,我不太喜欢这种方法,因为我们需要为每个表创建一个实体和大量的联结表。我建议使用一张表来存储联系信息,另一张表来存储地址。
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