Mysql 跨多个一对多表强制执行约束

Mysql 跨多个一对多表强制执行约束,mysql,constraints,Mysql,Constraints,我有以下高度简化的数据库模式: 总之: 一个帐户有一对一的用户 一个帐户有多个一对多的项目 一个项目有多个用户,一对多 我担心的是,用户属于项目,项目属于帐户,但使用此模式无法保证属于帐户的用户也属于属于项目的帐户 我的问题是:有没有一种方法可以使用MySQL添加约束,以确保属于某个项目的用户也属于属于该项目的帐户 我使用的是MySQL 5.1.56 无法保证属于某个帐户的用户也属于属于某个项目的帐户 对。但这不是MySQL的限制,而是您当前模式的限制。据我所见,您已经从users>accoun

我有以下高度简化的数据库模式:

总之:

一个帐户有一对一的用户 一个帐户有多个一对多的项目 一个项目有多个用户,一对多 我担心的是,用户属于项目,项目属于帐户,但使用此模式无法保证属于帐户的用户也属于属于项目的帐户

我的问题是:有没有一种方法可以使用MySQL添加约束,以确保属于某个项目的用户也属于属于该项目的帐户

我使用的是MySQL 5.1.56

无法保证属于某个帐户的用户也属于属于某个项目的帐户

对。但这不是MySQL的限制,而是您当前模式的限制。据我所见,您已经从users>accounts创建了1-1关系,这意味着在此模式下,一个用户只能属于一个帐户。如果您对这种限制关系的解决方案是在同一个表中有重复的用户,恐怕您有一个高度非规范化的模式,这将是未来许多麻烦的根源


我强烈建议您在尝试建立约束之前,首先关注业务实体的建模,至少遵循3NF。首先,听起来您需要在用户和帐户之间建立多对多关系,以便容纳属于某个帐户的用户,还需要属于另一个帐户的用户。首先,感谢Garcia Hurtado提供的宝贵反馈和意见。当社区中有人花费时间和精力提供深思熟虑的回应时,这绝对是值得赞赏的

我最终使用了一个复合密钥来解决这个问题。您可以使用以下SQL FIDLE查看架构:

它不允许您使用INSERT语句对其进行测试,因此只要下载并安装数据库模式即可进行测试

最简单的测试示例是使用以下SQL语句:

INSERT INTO  project_users (user_id, account_id) VALUES (1, 2)
这将引发以下MySQL错误:

#1452 - Cannot add or update a child row: a foreign key constraint fails

谢谢你的及时回复,@garciahurtado。我将调整模式,因为它实际上没有显示用户表中有唯一的电子邮件地址字段。我的缺点是过于简化图表。我也修改了描述以反映这一点。用户和帐户之间存在一对一的关系。我修改了摘要以反映这一点,因为我注意到我原来的描述也不准确。对不起,我刚刚注意到你也更新了这一部分。在更新的问题域中,我建议您实际上不需要在用户和帐户之间建立链接,因为您可以通过项目间接获得这种关系。这也是一种非规范化,我将尝试消除它。这可能吗?我同意这是非标准化的,因为有明显的冗余。这是你提出的一个有趣的思维实验。我正在查看整个模式,至少乍一看,它似乎会打破一些其他业务规则,或者只是将去规范化问题推到其他地方。一个明显的担忧是,用户不必属于某个项目,但仍然可以在系统中执行其他操作。其中哪一个项目应该保证用户和项目帐户之间的链接?如果我正确理解了您的业务领域,这将突出显示模式中的另一个差异,这是由用户和帐户之间的关系引起的。我仍然认为消除这种关系是解决你头疼问题的最简单方法。