一对多和多对一关系之间的真正区别是什么?它只是颠倒的,有点?
除了这个主题之外,我找不到任何关于这个主题的“易于理解”的教程:SQL for Beginners: Part 3 - Database Relationships
一对多和多对一关系之间的真正区别是什么?它只是颠倒的,有点?
除了这个主题之外,我找不到任何关于这个主题的“易于理解”的教程:SQL for Beginners: Part 3 - Database Relationships
是的,反之亦然。这取决于实体存在于关系的哪一侧。
例如,如果一个部门可以雇用多名员工,那么部门与员工之间是一对多的关系(一个部门雇用许多员工),而员工与部门之间的关系是多对一的(许多员工在一个部门工作)。
有关关系类型的更多信息:
从这个关于数据库术语的页面
大多数表之间的关系是一对多的。
例子:
- 一个区域可以成为许多读者的栖息地。
- 一位读者可以有多个订阅。
- 一份报纸可以有多个订阅。
多对一关系与一对多关系相同,但从不同的角度来看。
- 许多读者住在一个地区。
- 许多订阅可以是同一个读者。
- 许多订阅都是针对同一份报纸的。
一对多和多对一关系之间的真正区别是什么?
这些术语之间存在概念差异,应该可以帮助您可视化数据,并且应该完全理解生成的模式中可能存在的差异。主要区别在于视角之一。
在一对多关系中,本地表的一行可能与另一个表中的许多行相关联。在初学者 SQL的示例中,一个Customer
可能与多个Order
s 相关联。
在相反的多对一关系中,本地表可能有许多行与另一个表中的一行相关联。在我们的示例中,许多Order
s 可能与一个相关联Customer
。这种概念差异对于心理表征很重要。
此外,支持关系的模式在Customer
和Order
表中可能以不同的方式表示。例如,如果客户有列id
和name
:
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_id
id 列,我们会看到Bill Smith
(customer-id #1) 有 2 个与他关联的订单:一个是 12.34 美元,一个是 7.58 美元。 Jim Kenshaw
(customer-id #2) 只有 1 个订单,价格为 158.01 美元。
重要的是要意识到,通常一对多关系实际上不会将任何列添加到作为“一”的表中。Customer
没有额外的列来描述与 的关系Order
。实际上,可能还与和表具有Customer
一对多关系,但没有向表中添加其他列。ShippingAddress
SalesCall
Customer
但是,对于要描述的多对一关系,通常会id
在“多”表中添加一列,该列是“一”表的外键——在这种情况下,一customer_id
列会添加到Order
. 要将 12.34 美元的订单 #10 关联到Bill Smith
,我们将该customer_id
列分配给Bill Smith
的 id 1。
但是,也可能有另一个表来描述Customer
和Order
关系,因此不需要向Order
表中添加额外的字段。除了向表中添加customer_id
字段Order
外,还可以有一个Customer_Order
表同时包含Customer
和的键Order
。
customer_id,order_id
1,10
1,11
2,12
在这种情况下,一对多和多对一都是概念性的,因为它们之间没有模式更改。哪种机制取决于您的架构和 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] 级别实现关联表来解决这种关系。
没有区别。这只是语言和偏好的问题,你以哪种方式陈述这种关系。
一对多和多对一在多重性方面相似,但在方面(即方向性)方面不相似。
实体类之间的关联和表之间的关系的映射。有两类关系:
第一个问题的答案是:两者都相似,
对第二个问题的回答是:一对多 --> 一个 MAN(MAN 表)可能有多个妻子(WOMEN 表) 多对一 --> 多个女人娶了一个 MAN。
现在,如果您想将此关系与两个表 MAN 和 WOMEN 相关联,则一个 MAN 表行可能与 WOMEN 表中的行有许多关系。希望清楚。
这是一个很好的问题,根据我的经验,在 ERD 图和关系数据库中暗示了方向。在 RDBMS 中,您总是定义多对->一(平凡的一对->一)关系。关系的多方,也就是孩子,引用了一方,也就是父母,并且您使用外键约束来实现这一点。从技术上讲,您必须访问索引,获取一侧的主键记录,然后访问该记录以获取更多信息。
除非我们谈论对象关系 DBMS,例如 Postgres、Intersystems Cache 等,否则您不能以相反的方式执行此操作。这些 DBMS 允许您定义两个实体(表)之间的双向关系。在这种情况下,以相反的方式访问记录,即 One-To-->Many 是通过使用引用数组(子项)来实现的。在 ORM 中,您的类相互引用的方式与我们在此处描述的方式相同。
警告:IT 市场中的大多数 RDBMS 都不是严格意义上的关系数据库管理系统,考虑空值、重复记录等,其中许多允许的功能打破了关系的定义。
没有实际区别。考虑到您对问题的看法,如 Devendra 所示,只需使用最有意义的关系即可。
一对多和多对一关系是指相同的逻辑关系,例如一个 Owner 可能有多个 Home,但一个 Home 只能有一个 Owner。
所以在这个例子中,所有者是唯一的,而房屋是众多的。每个 Home 总是有一个 owner_id(例如外键)作为额外的列。
这两者在实现上的区别在于哪个表定义了关系。在一对多中,所有者是定义关系的地方。例如,owner1.homes 列出了所有具有 owner1 的 owner_id 的家。在多对一中,家是定义关系的地方。例如,home1.owner 列出了 owner1 的 owner_id。
我实际上不知道在什么情况下您会实施多对一安排,因为您已经知道 owner_id,这似乎有点多余。也许它与删除和更改的清洁度有关。
对于这种关系,我能给出的最简单的解释是背靠 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
)---一对多---父母可以有两个或更多的孩子。
---多对一---这3个孩子可以有一个父母
两者相似。这个可以根据需要使用。如果您想为特定的父母寻找孩子,那么您可以选择一对多。否则,想为双胞胎寻找父母,您可以选择多对一。
一对多的父类包含 n 个子类,因此它是一个集合映射。
多对一有n个孩子包含一个父母所以它是一个对象映射