1

试图设计数据库的一部分来保存地址、公司和联系人。我有一个设计,由于设计不佳,我现在已经完成了“清理”它的工作。

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

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

这看起来正确还是我完全错过了重点?

4

3 回答 3

1

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

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

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

ERP 系统部署这些结构主要是或接近于:

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

地址(主要是在网站中直接引用,有时是网站的一部分)

地区+国家(都是“基本”数据,地址表中ID引用)

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

于 2012-08-01T15:19:57.390 回答
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

于 2013-08-12T17:47:42.853 回答
0

几个想法:

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

通常您找不到与实体分开的地址表。换句话说,您的公司表应该包含完整的地址。

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

于 2012-08-01T15:14:28.213 回答