Database design 强制实体仅作为关系表中的父项或子项存在

Database design 强制实体仅作为关系表中的父项或子项存在,database-design,Database Design,编辑:很抱歉,我现在已经改写了我的问题,因为我和我的同事刚开始写的时候都很匆忙,我注意到它的措辞很糟糕 我的联系方式如下: 联系 联系人id 还有一些字段 联系人必须是子联系人或父联系人。我有一个父子关系表: 父母子女 身份证件 父id 子id 此表中的树深度不能大于1(我已经知道如何执行此操作)。我不确定的是,我想确保在添加到“parent children”表时,不能将父项和子项添加到错误的列-即父项只能添加到父项列,子项只能添加到子项列 联系人目前被定义为在联系人表中带有标志的父级或子级,

编辑:很抱歉,我现在已经改写了我的问题,因为我和我的同事刚开始写的时候都很匆忙,我注意到它的措辞很糟糕

我的联系方式如下:

联系
联系人id
还有一些字段

联系人必须是子联系人或父联系人。我有一个父子关系表:

父母子女
身份证件
父id
子id

此表中的树深度不能大于1(我已经知道如何执行此操作)。我不确定的是,我想确保在添加到“parent children”表时,不能将父项和子项添加到错误的列-即父项只能添加到父项列,子项只能添加到子项列

联系人目前被定义为在联系人表中带有标志的父级或子级,我认为这不是最好的系统。这是因为父母可能并没有孩子,或者孩子并没有父母,所以“父母子女”中并没有联系人


总之,我想存储的联系人必须是父级或子级。它们不必是任何关系的一部分,但如果它们是,它们将被存储为父子关系,而父子关系只能有一个深度(强制执行树深度是我目前知道的部分),我想确保父联系人只能是关系表中的父联系人,而且子联系人只能是关系表中的子联系人。

我不知道是否了解您的问题,但如果您需要记录不“丰富”的父子关系,您可以将所有内容保存在一个表中,甚至可以提高性能

Contact
-IdContact
-IdParentContact  (will be an IdContact)
-OtherFields
所有根目录的ParentContact都将为NULL

我遗漏了什么吗?

您可以简化事情(如果最大深度为1):

餐桌上的人

id | parent_id | name
表触点

id | people_id 
工作原理:

如果
parent\u id为空
,则people表外的人员是父级人员

选择所有子项:

SELECT * FROM people WHERE parent_id IS NOT NULL
选择所有家长:

SELECT * FROM people WHERE parent_id IS NULL
选择所有父联系人:

SELECT * FROM contacts
   INNER JOIN people ON people.id = contacts.people_id 
WHERE
   people.parent_id IS NULL
SELECT * FROM contacts
   INNER JOIN people ON people.id = contacts.people_id 
WHERE
   people.parent_id IS NOT NULL
选择所有子联系人:

SELECT * FROM contacts
   INNER JOIN people ON people.id = contacts.people_id 
WHERE
   people.parent_id IS NULL
SELECT * FROM contacts
   INNER JOIN people ON people.id = contacts.people_id 
WHERE
   people.parent_id IS NOT NULL

谢谢,这是一个很好的解决方案,但我忘了提到,你可以有一个没有父母的孩子接触。任何其他帮助感谢,请查看我的编辑,因为我已经试图表达我的问题更好。