2014-12-20 29 views
0

我正处于设计我的数据库的最后阶段,并具有以下设计问题。关于通用外键的设计问题

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

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

我听到有人说'如果他们在一对一的关系只是把它们放在一张桌子'。然而,我有这种感觉(而且这只是一种感觉),他们应该在不同的表格中,因为它们是不同的实体。

我应该把它们放在一张桌子上吗?循环外键是否存在问题?

谢谢

+0

几个A可以与相同的B(或反之亦然)相关联,还是它们之间有独特的配对? – Mureinik

+0

这些东西是什么,真的吗? –

+0

@Mureinik - 是几个B可以与一个A – user3083672

回答

1

我很难想出不同实体之间1-1关系的例子。通常,在一边或另一边有一个选项。考虑放在书架上的书。书架上的每个插槽都有一本书。而一本书就占据了一个位置。但是,您可能会有空插槽,未保存的书籍或书籍可能会随着时间的推移而切换插槽。这只是一个例子。

接下来的问题是访问路径。如果两个“实体”同时被访问,则考虑将它们放在一个表中。我有一个警告说这个。有时你想将列拆分成不同的表格(通常是出于性能原因)。这称为垂直分区。

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

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

0

在橄榄球中,您不能每次尝试进行一次以上的转换(或罚分),因此您无法为一个A获得多个B(如您在其中一条评论中所述)。每次尝试通常都会有一次转换尝试 - 这是1-1关系。此外,尝试将始终存在于其转换之前。

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

对我来说,最简单的方法是在转换表中创建一个外键返回到关联的try。如果惩罚转换也保存在同一个表中,那么外键将接受空值。这样,您可以首先插入try(假设您必须暂时这样做),而不用担心转换表的参照完整性。然后,您可以稍后添加转换,而无需返回并将尝试表的引用更新为新添加的转换。

+0

感谢您的有益评论。我知道你每次尝试的转换次数不能超过一次,但我的意思是有两种不同类型的尝试(标准尝试和惩罚尝试)。转换将需要链接到或者取决于尝试的类型。 – user3083672

0

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

称为共享主键的技术是模拟有用IS-A关系和其他单一对一的关系。将外键用作共享主键会强化关系的一对一性质。由于一个副本是另一个副本的副本,因此不会出现引发此问题的循环绑定。

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

如果出于某种奇怪的原因,您确实需要在单独的表中使用标准尝试和惩罚尝试,则可以使用类表继承与共享主键一起对标准尝试,惩罚尝试和尝试。

我只是把尝试放在一张桌子上。