我对SQL关系感到困惑,特别是一对一和一对多。我读过许多文章,例如this和this
举个例子,下面是这些文章和其他一些文章中的一些陈述
客户和地址表之间的关系是一对一的,这是因为一个地址属于一个客户。
客户和订单表之间的关系是一对多的,这是因为一个客户可以订购很多订单。
customer和contactData表是一对一的,因为一个contactData属于一个客户
是的,是的,但现在就接受我的论点。
所有这些,我都很困惑。有人能给我一个关于如何找到这种关系的明确定义吗?
答案 0 :(得分:4)
客户和订单表之间的关系是一对多的,这是因为一个客户可以订单很多。
这应该更好阅读
因此,表之间存在一对多关系。
customer和contactData表是一对一的,因为一个contactData属于一个客户
这应该更好阅读
因此,表之间存在一对一关系。
是的,实际上某个公司的客户可能有多个联系人,但在他们所讨论的这个特定数据库中,定义了一个客户只能拥有一个contactData。
编辑:我应该补充一点,你可以说“表a和b之间存在一对多的关系”,但没有说明哪一个是哪个,所以你可以更精确地说“有一个到从表a到b的许多关系“或”表b中的多对一关系为“。一对一,你当然没有这样的问题。 (除此之外,还有更精确的定义,例如“一对一或零”等,您可以指定是否允许零记录,例如没有联系人数据的人。)
答案 1 :(得分:2)
适配器。你在对称地看待这个主题时犯了一个错误。关系被认为是单向的,这就是你感到困惑的原因。
我们举个例如 Customer< - >订单关系。就像你观察到的那样,客户 - >订单与订单完全不同 - >客户。它们实际上是独立的,但可能很奇怪。这是因为在真实的代码中,你实际上从未真正处理过两个对象,而不是"代理"从两个角度来看。例如。您从数据库中获取订单对象,然后您才能成为订单的客户。或者您有客户对象,并且您想检查他的订单是什么。
如您所见,这是非常单向的(我们将关系称为单向或双向)。你有对象X,你想"增强"你对它的了解,通过将它与另一个表,对象Y连接起来。所以它是 X-> Y 。或者 Y-> X 。但实际上从来没有 X< - > Y 。这就是为什么你总是要把关系看作是独立的。
除此之外,你是对的,通常是这样,一个关系是一对一,另一个一对多。
答案 2 :(得分:2)
第2点显然是one to many
,因为一个customer
可以有多个orders
,但每个order
只属于一个customer
。
你必须在两个方向阅读关系。
想象一下这种关系是one to one
。每次要下新订单时,您都需要创建一个新的客户帐户。
第3点可能是一个设计问题。如果您想允许多个contactData
,则没有理由保留one to one
。
答案 3 :(得分:0)
你的"第2点"得到了Rav的回答。
"第3点":我在你的第一个链接中找到了一对一的例子"地址"表。在此示例中,客户只能拥有一个地址。因此,如果您的客户可以拥有多个客户,那么您将需要一对多(如示例订单中所示)。