Mysql oracle中表间关系的不同实现方式

Mysql oracle中表间关系的不同实现方式,mysql,sql,oracle,Mysql,Sql,Oracle,我看到,通过两种方式实现“州”和“区”之间的关系: 州和地区之间的关系分别是一对多的关系 第一种方式: 在这个实现中,取两个表“States”和“Districts”,并实现州与地区之间的一对多关系,将外键放在Districts表中 In my "States" table the columns are: state_id(pk) & state_name. In my "Districts" table the columns are: district_id(

我看到,通过两种方式实现“州”和“区”之间的关系:

州和地区之间的关系分别是一对多的关系

第一种方式:


在这个实现中,取两个表“States”和“Districts”,并实现州与地区之间的一对多关系,将外键放在Districts表中

 In my   "States" table the columns are:  state_id(pk) &  state_name.

 In my   "Districts" table the columns are:  district_id(pk)  district_name   state_id(fk).
第二种方式:


在我的“States”表中,列是:state\u id(pk)和state\u name

在我的“地区”表中,列为:地区id(pk)地区名称

第三个表是“州/区”,列为s_-did(pk)、区/区id(fk)、州/区id(fk)


这两种机制的区别是什么

如果州与地区之间存在多对多关系,则应采用第二种方法


第一种方法是正确的,您应该实现。

对于一对多关系,我们使用一个表的主键作为另一个表的外键-在这种情况下,这是正确的第一种方法


对于多对多关系,我们使用第三个表来存储前两个表之间的关系-这在您的情况下不是必需的,因为州与地区之间有一对多关系

不同的是,在第一种情况下,每个地区只能有一个州,而在第二种情况下,每个地区可以有多个州


您应该使用哪一个完全取决于一个地区是否可以与多个州关联。如果可以,那么您必须使用第二个多对多模型。如果他们不能,那么在实践中,您可以使用第二个模型,这样做是不正确的——您应该使用第一个一对多模型。

我建议使用以下表格结构:

States: --don't need extra metadata such as the sequence generated value  
state_name varchar2(50) PRIMARY KEY

Districts:  -- don't need extra metadata
district_name varchar2(100) PRIMARY KEY

State_Districts
state_name varchar2(50)
district_name varchar2(100)  
primary key (state_name,district_name)
这确保了您没有重复的
地区名称
,这些名称是真正的唯一标识符,无论怀俄明州和宾夕法尼亚州是否具有相同的地区名称,数据都是相互独立的。这也确保了三个表中的任何一个都不会有空值,这在我们考虑规范化技术时非常重要

这两种机制的区别是什么

不同之处在于,第二种方法允许一个地区与多个州关联。只需在第三个表中为给定地区添加另一行即可

INSERT INTO state_district (district_id, state_id) VALUES
 (1234, 49), (1234, 50);
现在您有了与阿拉斯加(49)和夏威夷(50)相关联的同一地区1234


我想你真的不需要这个。事实上,最好确保每个地区只属于一个州。州和地区之间应该只有一对多的关系。因此,您应该使用第一种设计。

从两个表的第一个表定义中可以看出,District表中有一个State ID字段。这向我表明,每个州有一个或多个区。在这种情况下,第三个表是多余的。

但第二个表也实现了一对多关系。有什么区别。这只是不必要创建第三个“实体”,而实际上它并不存在。如果我使用第二种方法,是否有任何缺点或缺点。缺点是您需要维护另一个表。因此,如果您可以在两个表中执行某些操作,那么为什么要创建另一个表呢。您的第二种方法不会给出任何错误的数据,并且会显示相同的一对多关系,但会增加您的维护活动。嗯,在我们开始讨论“维护其他表的缺点”之前,您可能希望了解规范化如果事实证明区名只有在一个州内才是唯一的,那么要求区名是唯一的可能会有问题。@Davidadridge想详细说明一下吗?我唯一的假设是一个地区对于一个州来说是独一无二的。也就是说,
(PA,BERKS),(PA,BERKS)
永远不会发生<代码>(PA,BERKS),(MD,BERKS)仍然有效,并将正确反映在我的表格中。我的意思是,无论处于何种状态,只能有一个“BERKS”。在地区上使用名称作为PK似乎并不可靠(事实上,我也不会在州上使用它)。@DavidAldridge我想我在几年前的关系代数课上遗漏了一些东西。如果参数是删除
状态
地区
表,并且只有
状态_地区
表,我可以看到。如果是别的事情,我想我没有领会你的意思
INSERT INTO state_district (district_id, state_id) VALUES
 (1234, 49), (1234, 50);