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

Sql 为数据库设计联系人/公司/地址表,sql,Sql,试图设计数据库的一部分来保存地址、公司和联系人。我有一个设计,由于设计不好,我现在得到了“清洁”它的工作 买了一本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 > Regio

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

买了一本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)
通过检查确保所有区域都是唯一的,以防止重复

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自动增量也是一个方便的功能)

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

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

ERP系统部署的此类结构主要包括:

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

地址(主要在现场直接引用,有时是现场的一部分)

地区+国家(均为“基本”数据,由地址表中的ID引用)

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

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

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

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

ERP系统部署的此类结构主要包括:

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

地址(主要在现场直接引用,有时是现场的一部分)

地区+国家(均为“基本”数据,由地址表中的ID引用)

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

您可能希望通过允许向公司添加多个地址和联系人来验证您的设计。您要做的是使用连接表创建多对多关系

CompanyAddress表允许您为每个公司拥有多个地址。您也可以对联系人执行相同的操作,具体取决于联系人是否与公司或地址关联。下面是另一个关于如何创建多对多关系的链接


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

CompanyAddress表允许您为每个公司拥有多个地址。您也可以对联系人执行相同的操作,具体取决于联系人是否与公司或地址关联。下面是另一个关于如何创建多对多关系的链接


反响很好。另外,varchar(80)PK也会让你头疼。SQL比较和加入要困难得多。地址不属于公司,因为它们与公司是分开的。您应该有一个地址的主键(应该是数字的,否则就列出了)。如果您有多家公司拥有相同的邮政地址,这一点尤其正确-您不希望有两次相同的条目。邮政编码(更普遍地称为邮政编码)的优点。@X-Zero,我同意多个营业地点。我的意思是,也应该说,地址本身不应该是表。相反,公司表应该有一个子表(称为CustomerLocations),该子表有一个指向custo的外键