0

我已经看到,以两种方式实现“州”和“地区”之间的关系:

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

第一种方式:


在这个实现中,取两个表“States”和“Districts”,实现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).

第二种方式:


  In this implementaion,take two tables "States" and "Districts" and implement the one to   many relationship between States to District as creating  the third table  "state_district" and implementing as follows.

在我的“状态”表中,列是:state_id(pk) & state_name。

在我的“地区”表中,列是: District_id(pk) District_name 。

第三个表是“state_district”,列是s_did(pk)、district_id(fk)、state_id(fk)。

这两种机制有什么区别。

4

6 回答 6

3

不同之处在于,在第一种情况下,每个地区只能有一个州,而在第二种情况下,每个地区可以有很多州。

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

于 2013-10-28T13:00:16.853 回答
2

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

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

于 2013-10-28T11:15:00.320 回答
2

这两种机制有什么区别。

不同之处在于第二种方法允许一个地区与多个州相关联。您可以通过在第三个表中为给定区域添加另一行来做到这一点。

INSERT INTO state_district (district_id, state_id) VALUES
 (1234, 49), (1234, 50);

现在,您拥有与阿拉斯加 (49) 和夏威夷 (50) 相关联的同一个区 1234。

我会假设你并不需要这个。实际上,最好确保每个区都完全属于一个州。州和地区之间应该只有一对多的关系。所以你应该使用第一个设计。

于 2013-10-28T13:12:53.957 回答
1

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

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

于 2013-10-28T11:07:45.297 回答
0

我会提出以下表格结构:

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)

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

于 2013-10-28T13:05:05.590 回答
0

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

于 2013-10-29T13:16:26.097 回答