为数据库设计联系人/公司/地址表



试图设计数据库的一部分来保存地址、公司和联系人。我有一个设计,由于设计不好,现在我得到了"清洁"它的工作。

买了一份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

但这意味着,例如,如果我想将订单挂接到联系人上,我需要使用三个字段。

这看起来对吗?还是我完全没有抓住要点?

首先,我建议使用整数值作为主键(如果使用mysql auto_increment也是一个方便的功能)

在其他表中将PK(主键)用作FK(外键)时,请使用相同的数据类型,并且不要保存名称。您似乎将company_name保存在"联系人"中,尽管您可以简单地保存公司的ID并通过加入选择获得名称。

在您的情况下,这是可以的,因为名称是主键(varchar),但当您两次获得相同的公司名称时会发生什么(例如Mc Donalds有多个位置)

ERP系统部署的结构大多与相同或接近:

公司(id和名称)站点(id、名称、FK公司、地址等附加信息)

地址(大多直接在站点中引用,有时是站点的一部分)

地区+国家(所有这些都是"基本"数据,由地址表中的ID引用)

company表大多只保存公司的ID和名称。站点表(与公司有外键关系)为"公司"提供地址、法律信息等。

几个想法:

首先,一个邮政编码可以代表同一州的多个城市/城镇。此外,一个城市可以有多个邮政编码。

通常你找不到一个独立于实体的地址表。换句话说,您的公司表应该包含完整的地址。

表的主键通常是与实际名称分开的唯一标识符或自动递增数字。这样,如果公司或联系人更改了名称,或者输入并更正了拼写错误,则无需将更改级联到其他表中。

您可能希望通过允许在公司中添加许多地址和联系人来验证您的设计。您要做的是通过使用连接表来创建多对多关系(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

最新更新