对 SQL 关系感到困惑
Confused on SQL Relationships
我对 SQL 关系感到困惑,特别是一对一和一对多关系。我读过很多文章,比如 this and this
例如,下面是这些文章和其他文章中的一些陈述
customer表和address表是一对一的关系,因为一个地址属于一个customer
customer表和order表是一对多的关系,因为一个customer可以下很多单。
customer 和 contactData 表是一对一的,因为一个 contactData 属于一个客户
是的,没错,但现在接受我的论点。
- 在第 2 点中它说关系是一对多的,但是一个订单属于确切的一个客户,对吗?所以你也可以认为它是一对一的。
- 第3点contactData和customer的关系据说是一对一的,但是一个customer可以有多个contactData对吧?所以是一对多
所有这些,我很困惑。有人可以给我一个关于如何找到关系的明确定义吗?
加密狗。你在对称地看待这个主题时犯了一个错误。关系被认为是单向的,这就是为什么你感到困惑。
让我们以这种 Customer <-> Order 关系为例。正如您观察到的,customer -> order 与 order -> customer 完全不同。他们实际上是独立的,无论它多么奇怪。这是因为在实际代码中,您实际上从未同时处理两个对象,而不是从两个对象之一的角度来看 "acting"。例如。您从数据库中获取了订单对象,然后您才是发出此订单的客户。或者你有客户对象,你想检查他的订单是什么。
如您所见,这是非常单向的(我们称关系为单向或双向)。你有对象 X,你想 "enhance" 通过将它与另一个 table,对象 Y 结合来了解它。所以它是 X->Y。或者 Y->X。但实际上从来没有 X<->Y。这就是为什么 你总是必须把关系看作是独立的。
除此之外,你是对的,通常是这样,一种关系是一对一,另一种是一对多.
点 2 显然是 one to many
因为一个 customer
可以有多个 orders
但每个 order
都属于一个 customer
.
你必须双向阅读关系。
假设这种关系是 one to one
。每次下新订单时都需要创建一个新的客户帐户。
第3点可能是设计问题。如果你想允许多个 contactData
就没有理由保留它 one to one
.
The relationship between customer and order tables are one to many, that is because one customer can make many orders.
这应该更好地阅读
- 一个顾客可以下很多个订单
- 一个订单属于一个位客户
所以表之间是一对多关系。
customer and contactData tables are one to one because one contactData is belong to one customer
这应该更好地阅读
- 一个联系人数据属于一个个客户
- 一个客户只能有一个个联系人数据
所以表之间是一对一关系。
是的,实际上某个公司的客户可能有多个联系人,但在他们谈论的这个特定数据库中,定义了一个客户只能有一个联系人数据。
编辑:我应该补充一点,你可以说 "there is a one to many relationship between tables a and b",它没有指定哪个是哪个,所以你可以更准确地说,说 "there is a one to many relationship from table a to b" 或 "there is a many to one relationship from table b to a"。一对一,你当然没有这样的问题。 (除此之外,还有更精确的定义,例如 "one to one or zero" 等,您可以在其中指定是否允许零记录,例如没有联系数据的人。)
你的 "point 2" 得到了 Rav 的回复。
"point 3":我在您的第一个链接中找到了 "Addresses" table 的一对一示例。在此示例中,一位客户只能有一个地址。因此,如果您的客户可以拥有多个客户,那么您将需要一对多(如示例订单中所示)。
我对 SQL 关系感到困惑,特别是一对一和一对多关系。我读过很多文章,比如 this and this
例如,下面是这些文章和其他文章中的一些陈述
customer表和address表是一对一的关系,因为一个地址属于一个customer
customer表和order表是一对多的关系,因为一个customer可以下很多单。
customer 和 contactData 表是一对一的,因为一个 contactData 属于一个客户
是的,没错,但现在接受我的论点。
- 在第 2 点中它说关系是一对多的,但是一个订单属于确切的一个客户,对吗?所以你也可以认为它是一对一的。
- 第3点contactData和customer的关系据说是一对一的,但是一个customer可以有多个contactData对吧?所以是一对多
所有这些,我很困惑。有人可以给我一个关于如何找到关系的明确定义吗?
加密狗。你在对称地看待这个主题时犯了一个错误。关系被认为是单向的,这就是为什么你感到困惑。
让我们以这种 Customer <-> Order 关系为例。正如您观察到的,customer -> order 与 order -> customer 完全不同。他们实际上是独立的,无论它多么奇怪。这是因为在实际代码中,您实际上从未同时处理两个对象,而不是从两个对象之一的角度来看 "acting"。例如。您从数据库中获取了订单对象,然后您才是发出此订单的客户。或者你有客户对象,你想检查他的订单是什么。
如您所见,这是非常单向的(我们称关系为单向或双向)。你有对象 X,你想 "enhance" 通过将它与另一个 table,对象 Y 结合来了解它。所以它是 X->Y。或者 Y->X。但实际上从来没有 X<->Y。这就是为什么 你总是必须把关系看作是独立的。
除此之外,你是对的,通常是这样,一种关系是一对一,另一种是一对多.
点 2 显然是 one to many
因为一个 customer
可以有多个 orders
但每个 order
都属于一个 customer
.
你必须双向阅读关系。
假设这种关系是 one to one
。每次下新订单时都需要创建一个新的客户帐户。
第3点可能是设计问题。如果你想允许多个 contactData
就没有理由保留它 one to one
.
The relationship between customer and order tables are one to many, that is because one customer can make many orders.
这应该更好地阅读
- 一个顾客可以下很多个订单
- 一个订单属于一个位客户
所以表之间是一对多关系。
customer and contactData tables are one to one because one contactData is belong to one customer
这应该更好地阅读
- 一个联系人数据属于一个个客户
- 一个客户只能有一个个联系人数据
所以表之间是一对一关系。
是的,实际上某个公司的客户可能有多个联系人,但在他们谈论的这个特定数据库中,定义了一个客户只能有一个联系人数据。
编辑:我应该补充一点,你可以说 "there is a one to many relationship between tables a and b",它没有指定哪个是哪个,所以你可以更准确地说,说 "there is a one to many relationship from table a to b" 或 "there is a many to one relationship from table b to a"。一对一,你当然没有这样的问题。 (除此之外,还有更精确的定义,例如 "one to one or zero" 等,您可以在其中指定是否允许零记录,例如没有联系数据的人。)
你的 "point 2" 得到了 Rav 的回复。
"point 3":我在您的第一个链接中找到了 "Addresses" table 的一对一示例。在此示例中,一位客户只能有一个地址。因此,如果您的客户可以拥有多个客户,那么您将需要一对多(如示例订单中所示)。