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

时间:2013-10-28 11:03:23

标签: mysql sql oracle

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

国家与地区之间的关系分别是一对多的关系。

第一种方式:


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

在我的“States”表中,列是:state_id(pk)& STATE_NAME。

在我的“区”表中,列为:district_id(pk)district_name。

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

这两种机制有什么区别。

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

  

这两种机制有什么区别。

不同之处在于第二种方法允许区域与多个状态相关联。您可以通过在第三个表中为给定区域添加另一行来完成此操作。

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

现在你有与阿拉斯加(49)和夏威夷(50)相关的1234区。

我认为你确实需要这个。事实上,最好确保每个地区属于一个州。你应该在州和地区之间只有一对多的关系。所以你应该使用第一个设计。

答案 3 :(得分:1)

如果州与地区之间存在多对多关系,那么应该采取第二种方式。

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

答案 4 :(得分: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这些是真正的唯一标识符,无论怀俄明州和宾夕法尼亚州是否具有相同的地区名称,数据是相互独立的。这也确保了三个表中的任何一个都没有空值,当我们考虑规范化技术时,这非常重要。

答案 5 :(得分:0)

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