尝试设计数据库的一部分来保存地址,公司和联系人。我有一个设计,由于设计不佳,我现在已经完成了“清洁”的工作。
购买了Joe Celko的SQL程序员样式的副本作为参考,因为我来自编程角度所以我最终得到了......
Addresses
street_1_adr varchar(80) primary key
street_2_adr varchar(80)
street_3_adr varchar(80)
zip_code varchar(10) foreign key/primary key > Regions.zip_code
检查以确保所有地址都是唯一的,以防止重复。
Regions
city varchar(80)
region varchar(80)
zip_code varchar(10) primary key
country_nbr integer foreign key/primary key > Countries.country_nbr
检查以确保所有区域都是唯一的以防止重复。
Countries
country_nbr integer primary key
country_nm varchar(80)
country_code char(3)
检查以确保所有信息只存在一条记录。
Companies
company_nm varchar(80) primary key
street_1_adr varchar(80) foreign key > Addresses.street_1_adr
zip_code varchar(10) foreign key > Addresses.zip_code
Extra information
检查以确保在指定的地址
中只能存在一个具有该名称的公司Contacts
company_nm varchar(80) primary key/foreign key > Companies.company_nm
first_nm varchar(80) primary key
last_nm varchar(80) primary key
Extra information
但是这意味着如果我想挂钩,作为一个例子,订单到一个联系人我需要用三个字段来做。
这看起来是正确还是我完全错过了这一点?
答案 0 :(得分:1)
首先,我建议为主键使用整数值 (如果使用mysql auto_increment也是一个方便的功能)
在不同的表中使用PK(主键)作为FK(外键)时,请使用相同的数据类型,不要保存名称。 您似乎将“company”保存在“联系人”中,即使您只需保存公司的ID并通过连接选择获取名称。
在你的情况下它没关系,因为这个名字是主键(varchar),但当你获得两次相同的公司名称时会发生什么(例如Mc Donalds有多个位置)
ERP系统主要将这些结构部署为或接近:
公司(身份证和姓名) 网站(ID,名称,FK公司,地址等附加信息)
地址(主要在网站直接引用,有时是网站的一部分)
region + country(所有这些都是“基本”数据,并由地址表中的ID引用)
公司表主要只保存公司的ID和名称。 站点表(与公司的外键关系)给“公司”其地址,法律信息等。
答案 1 :(得分:0)
有几点想法:
首先,邮政编码可以代表同一州的多个城镇。此外,一个城市可以有多个邮政编码。
通常您找不到与实体分开的地址表。换句话说,您的公司表应该带有完整的地址。
表的主键通常是唯一标识符或与实际名称分开的自动增量号。这样,如果公司或联系人更改了其名称,或输入并更正了拼写错误,则无需将更改级联到其他表。
答案 2 :(得分:0)
您可能希望通过允许将许多地址和联系人添加到公司来证明您的设计。您要做的是使用联结表(http://en.wikipedia.org/wiki/Junction_table)
创建多对多关系Company
--------------
CompanyID (PK)
...
Address
--------------
AddressID (PK)
...
CompanyAddress
--------------
CompanyID (PK)
AddressID (PK)
CompanyAddress表允许您为每个公司拥有多个地址。您也可以对联系人执行相同操作,具体取决于联系人是否与公司或地址相关联。下面是另一个关于如何创建多对多关系的链接。
http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php