关于圆形外键的设计问题

时间:2014-12-20 13:03:04

标签: mysql database-design

我正处于设计数据库的最后阶段,并遇到以下设计问题。

我有两个表,A和B.这些表基本上是一对一的关系 - 没有相应的B行,A行存在没有意义,反之亦然。

我最初的想法是创建相互的外键但如果我删除一个(鸡和蛋问题)会产生问题吗?我正在使用mysql。

我听说有人说“如果他们处于一对一的关系,只需把它们放在一张桌子上”。但是,我感觉(并且只是一种感觉)它们应该在单独的表中,因为它们是不同的实体。

我应该把它们放在一张桌子上吗?圆形外键有问题吗?

由于

3 个答案:

答案 0 :(得分:1)

我很难想到不同实体之间1-1关系的例子。通常,在一侧或另一侧有一个选项。考虑搁在货架上的书。架子上的每个插槽都有一本书。并且给定的书占据一个槽。但是你可以有空的插槽,没有书籍的书,或书籍可以随着时间的推移切换插槽。这只是一个例子。

下一个问题是访问路径。如果两个"实体"同时访问,然后考虑将它们放在一个表中。我这是一个警告。有时您确实希望将列拆分为单独的表(通常出于性能原因)。这称为垂直分区。

如果它们确实是独立的实体,那么使用两个表,每个表都有自己的主键。包含引用其他表的外键。插入记录时要小心,以保持参照完整性。

如果它们是同一个实体但具有不同的列,则对两者使用相同的主键。让密钥在一个表中自动递增。然后在创建该记录时将值插入第二个表。

答案 1 :(得分:0)

在橄榄球比赛中,每次尝试都不能有多次转换(或者点球尝试),因此一个A不能有多个B(正如您在其中一条评论中所述)。每次尝试通常都有一次转换尝试 - 这是一种1-1的关系。此外,尝试在转换之前始终存在。

您是否还在转化表中存储了罚款转换?如果你那么这些惩罚转换将不会与任何尝试相关联,因此与try没有硬1-1关系,并且try表的外键必须接受空值。同样,因为您要在try表中关联转换之前创建一个条目,转换的外键也必须接受空值。

对我来说,最简单的方法是在转换表中创建一个返回相关try的外键。如果惩罚转换也保留在同一个表中,则外键将接受空值。这样您就可以先插入try(假设您必须暂时执行此操作),而不必担心转换表的引用完整性。然后,您可以稍后添加转换,而无需返回并更新try表对新添加的转换的引用。

答案 2 :(得分:0)

看看这三个标签下的问题和信息:

称为共享主键的技术对于建模IS-A关系和其他一对一关系非常有用。使用外键作为共享主键强制实现关系的一对一性质。由于一个副本是另一个副本的副本,因此您不会处于引发此问题的循环绑定中。

转化和尝试之间的关系实际上是零或一对一。并非所有尝试都有转化。这意味着转换应该具有try的外键。如果没有转换,则没有行。讨论结束。

如果由于某些奇怪的原因,您确实需要在单独的表中进行标准尝试和惩罚尝试,则可以将类表继承与共享主键结合使用来模拟标准尝试,惩罚尝试和尝试之间的IS-A关系。

我只想把尝试放在一张桌子里。