一个非常简单的例子:
公司可以有N个位置,并且这些位置中的一个是主要位置。我们可以使用MySQL外键解决这个问题吗?
我们当前的方法是在每个位置(company_id)有一个指向Company的指针,在main_location_id中有一个指向Company的位置的指针。
假设我们不允许使用空引用,这种方法显然是错误的,因为它禁止创建:您不能创建公司,因为它没有main_location_id,并且您不能创建位置,因为如果没有company_id。鉴于验证仍在交易的每个步骤中进行,因此交易无济于事。
有什么想法吗?
谢谢!
为了解决该问题,有人建议在Location或中间表中使用具有唯一索引的标志。我们已经考虑了它,但是它有一个主要问题:它增加了开销,因为添加新的主要位置将需要遍历所有其他位置以将其标志设置为false。
(在理想情况下)我们的首选解决方案是在交易结束时而不是在每个步骤中检查验证。如注释中所建议,可以通过禁用外键检查来完成此操作,但这当然是次佳的解决方案。
如果不放松约束之一,就无法使用MySQL来实现。我们将在公司中使用插入前检查来检查位置参考是否为null。
尽管如此,我仍然对为什么MySQL不允许在事务结束时通过验证而不是在每个步骤中进行验证感到困惑。
答案 0 :(得分:1)
您必须具有三个表。
第一个,即您的Company
表,其中具有有关公司的标量信息(例如名称,财务代码等)
第二个是带有Location
的表,没有链接到您的公司。在此表中,即,您的行为:
以此类推
第三个中间表CompanyLocation
,其中有一个双外键companyId和locationId,第三个列由标志(isPrimary)表示
仅此而已