我已经看到,以两种方式实施“国家”和“地区”之间的关系:
国家与地区之间的关系分别是一对多的关系。
第一种方式:
在这个实现中,取两个表“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)。
这两种机制有什么区别。
答案 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字段。这向我表明每个州有一个或多个地区。在这种情况下,第三个表将是多余的。