Database design 有循环引用的数据库模型,可以避免吗?

Database design 有循环引用的数据库模型,可以避免吗?,database-design,software-design,object-model,Database Design,Software Design,Object Model,我有以下表格: 人 会员资格 person_会员资格(针对个人和会员之间的多对多) 关系 现在一个人可以拥有一个或多个会员资格。每个人都可以与成员中的另一个人关联 为了使上述功能正常工作,我将以下字段放在关系表中: 身份证 个人身份证 个人2_id 会员身份 如您所见,上面的引用将在成员关系、Person和关系之间循环引用。有没有办法或更好的设计来避免这种情况 例: 约翰和玛丽是1234会员 约翰和亚当是会员5678 在1234会员中,约翰是玛丽的丈夫 在membership 5678中

我有以下表格:

  • 会员资格
  • person_会员资格(针对个人和会员之间的多对多)
  • 关系
现在一个人可以拥有一个或多个会员资格。每个人都可以与成员中的另一个人关联

为了使上述功能正常工作,我将以下字段放在关系表中:

  • 身份证
  • 个人身份证
  • 个人2_id
  • 会员身份
如您所见,上面的引用将在成员关系Person关系之间循环引用。有没有办法或更好的设计来避免这种情况

例: 约翰和玛丽是1234会员 约翰和亚当是会员5678

在1234会员中,约翰是玛丽的丈夫


在membership 5678中,John是Adam的兄弟

没有技术理由在关系数据模型中避免循环引用。SQL处理得很好,如果实体是同一类型的实体,那么最好对关系进行相应的建模,以表示同一表中的实体。在某些数据库风格中甚至有特殊的关键字来支持递归/层次关系

如果这让您感到不舒服,只需习惯在SQL查询中使用表别名,例如当您出于不同原因(在不同级别)访问Person表时,以表示访问级别

换句话说,假设Person有一个父字段。每个Person记录将递归地指向父记录

select Children.*, Parent.name from person Children
  left join person Parents
    on Children.parentID = Parents.ID
现在,就好像您正在从两个不同的表中进行选择并合并。SQL不管您在查询中引用同一个表多少次,它每次都将其视为一个唯一的表(就我所说的目的而言)。您可以从个人中选择p1、p2、p3、p4等,并根据需要加入他们

如果您试图摆脱循环引用,会出现很多问题,这取决于以后的需求,而且它们通常不会很好地执行。由于缓冲区缓存的局部性,单人表将表现良好。如果您试图将Person表划分为不同的功能角色,那么不可避免地会遇到一些需求,即您需要在多个表中使用同一个人,并且最终会复制数据


视图是简化循环引用的另一个有用工具,具体取决于您是否可以将角色或记录类型标识符分配给个人。在许多情况下,视图可以按函数对基表进行切片/筛选。

为什么在关系表中有成员身份标识?关系将加入人员,人员成员资格将每个人加入一个成员资格。那不是科雷特吗?谢谢你的回答,克里斯。我在下面解释了我所做的。谢谢你的回答,梅尔文。正如Chris指出的那样,我实际上已经从关系表中删除了成员id。为了获得属于某个成员的两个人的关系(2是每个成员的最大人数),我只需查询这两个人的关系表。我认为这很容易。