2016-06-09 209 views
0

首先,我们有以下情景(不完全是这样的,但由于保密原因,我不会冒险来明确描述项目)在哪里让我们说一个人可以有很多家庭住址,显然是地址最多只能属于一个人。这几乎是一对多的关系,其中有两个表格(Person和Addresses),第二个表格持有FK引用所有者。但令人遗憾的是,我被告知我的系统还应该允许用户首先输入地址,因此在Person表中还不存在FK。我得出结论,我必须放弃这个约束。你做这件事很普遍吗?此外,即使没有FK(明确声明),我认为仍然保持一致性,如果有人更新人员ID,因为我不希望用户在两个表中都这样做,是否可以创建一个触发器(我正在使用Mysql服务器)会自动更新第二张表(如果该人有地址)?如果是,提示如何写(我不熟悉触发器)一对多关系

+0

看起来很简单......你有一个约束 - 然后被给予一个要求来打破这个约束。欢迎来到一个你不久有这种限制的世界。 – Hogan

回答

1

您可以通过创建通常与M:N关系相关的中间表类型来维护1:N关系,但添加唯一性约束在地址引用字段上;或者,您可以将地址'提供给可空的参考,使其成为可选参考。


[编辑]

从MySQL转储脚本包的内容的东西,如:

SET @[email protected]@FOREIGN_KEY_CHECKS; 
SET FOREIGN_KEY_CHECKS=0; 
.... 
SET [email protected]_FOREIGN_KEY_CHECKS; 

正如你可能已经猜到了,它暂时关闭外键检查,以便插入相互依存的数据没有秩序。但是,您应确定导入数据的可信性,因为我认为它在重新打开时不会重新检查数据(因此它可以允许违反FK约束的数据持续存在)。

如果您需要在用户输入数据之前在“人员”之前添加“地址”的能力,那么您又回到了需要可选键或其他表格的原始状态;或者只是在“人员”信息足够/完整之后才保存“地址”信息(而不是实际保存在数据录入程序中)。

+0

感谢您的回答!所以我明白(这是一个好主意),我们可以有一个连接表(使用唯一地址)。但假设我们有一个新的地址(我们所有的新地址都是与该地址关联的人的ID),我们首先插入地址表,然后当我们继续在连接表中插入PersonID和地址ID时,会出错吗?因为PersonID在Person表中尚不存在。或者我误解了一些东西? – Bobby

+0

你只是推迟插入到“加入”表,直到你有一个人。 – Uueerdo

+0

好吧,但如果我保持1:N关系(没有FK),它有多糟?因为我需要在数据库中导入大量数据,而且这个解决方案似乎有点复杂。 – Bobby