139

一对多和多对一关系之间的真正区别是什么?它只是颠倒的,有点?

除了这个主题之外,我找不到任何关于这个主题的“易于理解”的教程:SQL for Beginners: Part 3 - Database Relationships

4

13 回答 13

125

是的,反之亦然。这取决于实体存在于关系的哪一侧。

例如,如果一个部门可以雇用多名员工,那么部门与员工之间是一对多的关系(一个部门雇用许多员工),而员工与部门之间的关系是多对一的(许多员工在一个部门工作)。

有关关系类型的更多信息:

数据库关系 - IBM DB2 文档

于 2011-01-05T07:30:26.237 回答
34

从这个关于数据库术语的页面

大多数表之间的关系是一对多的。

例子:

  • 一个区域可以成为许多读者的栖息地。
  • 一位读者可以有多个订阅。
  • 一份报纸可以有多个订阅。

多对一关系与一对多关系相同,但从不同的角度来看。

  • 许多读者住在一个地区。
  • 许多订阅可以是同一个读者。
  • 许多订阅都是针对同一份报纸的。
于 2011-01-05T07:26:34.757 回答
26

一对多和多对一关系之间的真正区别是什么?

这些术语之间存在概念差异,应该可以帮助您可视化数据,并且应该完全理解生成的模式中可能存在的差异。主要区别在于视角之一。

一对多关系中,本地表的一行可能与另一个表中的许多行相关联。在初学者 SQL的示例中,一个Customer可能与多个Orders 相关联。

在相反的多对一关系中,本地表可能有许多行与另一个表中的一行相关联。在我们的示例中,许多Orders 可能与一个相关联Customer。这种概念差异对于心理表征很重要。

此外,支持关系的模式在CustomerOrder表中可能以不同的方式表示。例如,如果客户有列idname

id,name
1,Bill Smith
2,Jim Kenshaw

然后,为了使 aOrder与 a 关联Customer,许多 SQL 实现向Order表中添加了一个存储id关联的列Customer(在此模式中customer_id

id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2

在上面的数据行中,如果我们查看customer_idid 列,我们会看到Bill Smith(customer-id #1) 有 2 个与他关联的订单:一个是 12.34 美元,一个是 7.58 美元。 Jim Kenshaw(customer-id #2) 只有 1 个订单,价格为 158.01 美元。

重要的是要意识到,通常一对多关系实际上不会将任何列添加到作为“一”的表中。Customer没有额外的列来描述与 的关系Order。实际上,可能还与和表具有Customer一对多关系,但没有向表中添加其他列。ShippingAddressSalesCallCustomer

但是,对于要描述的多对一关系,通常会id在“多”表中添加一列,该列是“一”表的外键——在这种情况下,一customer_id列会添加到Order. 要将 12.34 美元的订单 #10 关联到Bill Smith,我们将该customer_id列分配给Bill Smith的 id 1。

但是,也可能有另一个表来描述CustomerOrder关系,因此不需要向Order表中添加额外的字段。除了向表中添加customer_id字段Order外,还可以有一个Customer_Order表同时包含Customer和的键Order

customer_id,order_id
1,10
1,11
2,12

在这种情况下,一对多多对一都是概念性的,因为它们之间没有模式更改。哪种机制取决于您的架构和 SQL 实现。

希望这可以帮助。

于 2016-06-21T20:45:54.380 回答
10

SQL

两个表有一个关系

在 SQL 中,只有一种关系,称为引用。(您的前端可能会做一些有用或令人困惑的事情[例如在某些答案中],但这是另一回事。)

  • 一个表(引用表)中外 键引用另一个表(引用)中主键

  • 在 SQL 术语中,Bar 引用 Foo
    而不是相反

    CREATE TABLE Foo (
        Foo   CHAR(10)  NOT NULL, -- primary key
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK             -- constraint name
            PRIMARY KEY (Foo)     -- pk
        )  
    CREATE TABLE Bar (
        Bar   CHAR(10)  NOT NULL, -- primary key
        Foo   CHAR(10)  NOT NULL, -- foreign key to Foo
        Name  CHAR(30)  NOT NULL
        CONSTRAINT PK                -- constraint name
            PRIMARY KEY (Bar),       -- pk
        CONSTRAINT Foo_HasMany_Bars  -- constraint name
            FOREIGN KEY   (Foo)      -- fk in (this) referencing table
            REFERENCES Foo(Foo)      -- pk in referenced table
        )
    
  • 由于Foo.Foo是主键,它是唯一的,任何给定的值只有一行Foo

  • 由于Bar.Foo是一个引用,一个外键,并且没有唯一索引,因此对于任何给定的值,都可以有很多行Foo

  • 因此关系Foo::Bar是一对多的

  • 现在您可以反过来感知(查看)关系,Bar::Foo是多对一的

    • 但是不要让您感到困惑:对于任何一行,它引用Bar的只有一行Foo
  • 在 SQL 中,这就是我们所拥有的。这就是所有必要的。

一对多和多对一关系之间的真正区别是什么?

只有一种关系,因此没有区别。感知(从一个“端”或另一个“端”)或向后阅读,不会改变关系。

基数

基数首先在数据模型中声明,这意味着逻辑和物理(意图),然后在实现中(实现的意图)。

基数

一对零对多
在 SQL 中,(以上)就是所需要的。

一对一对多
您需要一个事务来强制引用表中的一个。

一对零对一
您需要Bar

CONSTRAINT AK    -- constraint name
    UNIQUE (Foo) -- unique column, which makes it an Alternate Key

一对一
您需要一个事务来强制引用表中的一个。

多对多

在物理级别没有这样的事情(回想一下,SQL 中只有一种关系)。

在建模练习的早期逻辑级别,绘制这样的关系很方便。在模型接近实现之前,最好将其提升为仅使用可以存在的东西。通过在物理 [DDL] 级别实现关联表来解决这种关系。

多对多解决

于 2019-02-17T11:00:52.923 回答
5

没有区别。这只是语言和偏好的问题,你以哪种方式陈述这种关系。

于 2011-01-05T11:37:22.440 回答
5

一对多和多对一在多重性方面相似,但在方面(即方向性)方面不相似。

实体类之间的关联和表之间的关系的映射。有两类关系:

  1. 多重性(ER 术语:基数)
  • 一对一的关系(缩写为 1:1):例如丈夫和妻子
  • 一对多关系(缩写为 1:N):母子示例
  • 多对多关系(缩写为 M:N):学生和主题示例
  1. 方向性:不影响映射,但会影响我们访问数据的方式。
  • 单向关系:引用另一个实体的关系字段或属性。
  • 双向关系:每个实体都有一个引用另一个实体的关系字段或属性。
于 2017-09-03T10:20:32.933 回答
3

第一个问题的答案是:两者都相似,

对第二个问题的回答是:一对多 --> 一个 MAN(MAN 表)可能有多个妻子(WOMEN 表) 多对一 --> 多个女人娶了一个 MAN。

现在,如果您想将此关系与两个表 MAN 和 WOMEN 相关联,则一个 MAN 表行可能与 WOMEN 表中的行有许多关系。希望清楚。

于 2012-11-23T03:32:49.560 回答
2

这是一个很好的问题,根据我的经验,在 ERD 图和关系数据库中暗示了方向。在 RDBMS 中,您总是定义多对->一(平凡的一对->一)关系。关系的多方,也就是孩子,引用了一方,也就是父母,并且您使用外键约束来实现这一点。从技术上讲,您必须访问索引,获取一侧的主键记录,然后访问该记录以获取更多信息。

除非我们谈论对象关系 DBMS,例如 Postgres、Intersystems Cache 等,否则您不能以相反的方式执行此操作。这些 DBMS 允许您定义两个实体(表)之间的双向关系。在这种情况下,以相反的方式访问记录,即 One-To-->Many 是通过使用引用数组(子项)来实现的。在 ORM 中,您的类相互引用的方式与我们在此处描述的方式相同。

警告:IT 市场中的大多数 RDBMS 都不是严格意义上的关系数据库管理系统,考虑空值、重复记录等,其中许多允许的功能打破了关系的定义。

于 2021-04-16T12:01:54.047 回答
0

没有实际区别。考虑到您对问题的看法,如 Devendra 所示,只需使用最有意义的关系即可。

于 2013-08-07T08:37:26.340 回答
0

一对多和多对一关系是指相同的逻辑关系,例如一个 Owner 可能有多个 Home,但一个 Home 只能有一个 Owner。

所以在这个例子中,所有者是唯一的,而房屋是众多的。每个 Home 总是有一个 owner_id(例如外键)作为额外的列。

这两者在实现上的区别在于哪个表定义了关系。在一对多中,所有者是定义关系的地方。例如,owner1.homes 列出了所有具有 owner1 的 owner_id 的家。在多对一中,家是定义关系的地方。例如,home1.owner 列出了 owner1 的 owner_id。

我实际上不知道在什么情况下您会实施多对一安排,因为您已经知道 owner_id,这似乎有点多余。也许它与删除和更改的清洁度有关。

于 2020-10-15T21:36:57.573 回答
0

对于这种关系,我能给出的最简单的解释是背靠 evendra D. Chavan's答案。

使用部门和员工关系

一个部门可以有多个员工,所以从员工方面来说,它是one-to-many关系,而从部门方面来说,它是关系。many-to-one relationship

但是如果一个员工也可以属于多个部门,我们也可以从员工方面说它现在many是反对one,所以关系变成many-to-many

换句话说,一个简单的理解是,我们可以说一个关系是many-to-many如果one-to-many可以从双方来看,即如果;

  • 一名员工可以属于多个部门 ( one-to-many)
  • 一个部门可以有很多员工 ( one-to-many)
于 2021-06-13T06:23:00.730 回答
0
  • ---一对多---父母可以有两个或更多的孩子。

  • ---多对一---这3个孩子可以有一个父母

    两者相似。这个可以根据需要使用。如果您想为特定的父母寻找孩子,那么您可以选择一对多。否则,想为双胞胎寻找父母,您可以选择多对一。

于 2018-02-01T10:00:24.560 回答
-5

一对多的父类包含 n 个子类,因此它是一个集合映射。

多对一有n个孩子包含一个父母所以它是一个对象映射

于 2013-01-07T12:30:42.590 回答