困惑于SQL关系

时间:2015-01-30 10:24:08

标签: sql relational-database

我对SQL关系感到困惑,特别是一对一和一对多。我读过许多文章,例如thisthis

举个例子,下面是这些文章和其他一些文章中的一些陈述

  1. 客户和地址表之间的关系是一对一的,这是因为一个地址属于一个客户。

  2. 客户和订单表之间的关系是一对多的,这是因为一个客户可以订购很多订单。

  3. customer和contactData表是一对一的,因为一个contactData属于一个客户

  4. 是的,是的,但现在就接受我的论点。

    • 在第2点,它表示关系是一对多,但一个订单属于确切的一个客户权利?因此,您也可以将其视为一对一。
    • 在第3点,contactData和客户关系表示是一对一的,但是一个客户可以拥有多个contactData吗?所以它是一对多的

    所有这些,我都很困惑。有人能给我一个关于如何找到这种关系的明确定义吗?

4 个答案:

答案 0 :(得分:4)

  

客户和订单表之间的关系是一对多的,这是因为一个客户可以订单很多。

这应该更好阅读

  • 客户可以许多订单
  • 订单属于一个客户

因此,表之间存在一对多关系。

  

customer和contactData表是一对一的,因为一个contactData属于一个客户

这应该更好阅读

  • 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点":我在你的第一个链接中找到了一对一的例子"地址"表。在此示例中,客户只能拥有一个地址。因此,如果您的客户可以拥有多个客户,那么您将需要一对多(如示例订单中所示)。