我想提出一个数据库,用于一个程序,我应该模型的一些关系的家庭。例如: X的父亲Y,Y是的儿子X

因此,我有一个 成员 表与所有有关的信息的每个成员的,所以我想关于使多对多关系 成员 表和自身以使 Member_Member 桥表将有列 "FK_FromID,FK_ToID" 作为复合的关键(这是正确的?) 和 "FK_RelationType" 作为一个外国的关键 RelationTypes 表,这将有关系类型"父亲、母亲、儿子、女儿",以及两个关系将作为一个为许多成员表到这两个外国的钥匙

我的问题是 :当删除,如果我选择级联然后我会做循环,因为如果我删除一个部件,然后将有两个删除传递给相关记录 Member_Member 桥,知道在程序,只要我插入一个父亲的关系,我将插入一个儿子的关系以及在Member_Member表,是否有一种方法或解决办法能够使级联,这样,只要我删除一件我将删除有关记录在 Member_member 无论被记录在任何一个或一个外国的关键柱

所以,我不知道该怎么做,这是一个正确的设计在第一个地方还是什么? 什么我应该做的关于骑自行车,还有什么你觉得一个更好的设计相同的问题应该知道我需要规定什么样的关系,双方之间

非常感谢任何的帮助,并对不起不好英语 Bishoy

有帮助吗?

解决方案

SQL不处理这种“网络”的问题非常好。

在构件-构件桥接表是一种可怕的名称。这是一个“成员父”(或“父子”)桥。桥表不应该有一个“复合键”。桥表有一个代理键(只是一个序列号)和一对FK引用的其它表。这两个FK的应该有一个像“成员”和“父母”的名称,使之清透的关系是此表中的内容。

每个人都有一个母体。不是每个人都有孩子。有些家长不会在这个数据库的父母;他们是“顶部的父母。”

这是最简单的,如果顶部家长在亲子桥梁与父母NULL的FK行。这样,你避免超复杂外连接 - 每个成员至少有一个成员父行;理想地2

您会发现许多“循环”的问题,因为关系是传递的。

请注意,你不能 - 在一个标准的SQL查询 - 找到所有家庭成员,或者所有的父母回到家族的顶部,或者所有的儿童和盛大的孩子。有迹象表明,使这成为可能SQL扩展,但标准不处理得很好。

在级联删除不解决好,因为在一个家庭中的关系是针对两种方式(父母的孩子,孩子的父母),但只有SQL有一种方向(FK参考)。

可以尝试以确保每一个成员必须具有至少一个(且至多两个)中的“构件父”行删除一个成员的删除“成员 - 两排家长” 按键则有适当的名称,你可能会做这项工作的组成部分。

请注意,当你删除一个成员,这将打破他们父母的关系。您删除的成员 - 父行。那很好。什么自己的孩子?其具有构件母体参照该已删除父其他行现在打破。这是什么意思?应该做什么?

  

有没有标准答案。从连接的图中移除行离开元件   悬空。你必须为制定一些合理的规则。

由于SQL没有做好这一点,所有的设计会显得有问题。

其他提示

  1. 假设每个成员只能有一个母亲和一个父亲,你将能够得出所有的关系,通过简单的保留 mother_idfather_idmembers 表。

    然而,这只会的工作,如果你的数据库 将不会 缺失的信息。例如,如果件X是兄弟件Y,将会有没有办法知道这一点,除非父母的X和Y是存储在数据库。

    如果你的数据库将不会有缺失的信息,上述可能更易于管理的数据的完整性。查询可能会有点复杂不过。

  2. member_member 桥你的建议具有一个严重的问题,因为它意味着一个方向的关系,因此,如果X的父亲Y,Y还是儿子。你建议的定义的关系,两次在两个方向,但总的来说,这不是建议。这是一种形式的数据重复,并可以斗争以强制实施引用完整性与重复的数据。记住,DBMS不知道,X的父亲Y相同Y是的儿子X.

我知道,这不是一个完整的答案,但是只是几点意见。我完全同意 S.洛特的答案 在没有标准的方式"解决"这一用关系的数据库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top