一对多和多对一关系的真正区别是什么?它只是颠倒了,有点吗?
除了这个主题之外,我找不到任何关于这个主题的“易于理解”的教程:SQL for Beginners: Part 3 - Database Relationships
答案 0 :(得分:95)
是的,反之亦然。这取决于实体所在的关系的哪一方。
例如,如果一个部门可以雇用几个员工,那么部门到员工是一对多的关系(1个部门雇用了许多员工),而员工与部门的关系是多对一(许多员工在一个部门工作)。
更多信息:
答案 1 :(得分:28)
从此page about Database Terminology
表之间的大多数关系是一对多的。
示例:
- 一个地区可能是许多读者的栖息地。
- 一位读者可以订阅很多。
- 一份报纸可以订阅很多。
多对一关系与一对多关系相同,但从不同的角度来看。
- 许多读者住在一个地区。
- 许多订阅可以是同一个读者。
- 许多订阅适用于同一份报纸。
答案 2 :(得分:15)
一对多和多对一关系之间的真正区别是什么?
这些术语之间存在概念上的差异,这些术语应该可以帮助您可视化数据,以及应该完全理解的生成架构中的可能差异。大多数情况下,差异是透视之一。
在一对多关系中,本地表有一行可能与另一个表中的许多行相关联。在SQL for beginners的示例中,一个Customer
可能与许多Order
相关联。
在相反的多对一关系中,本地表可能有许多行与另一个表中的一行相关联。在我们的示例中,许多Order
可能与一个Customer
相关联。这种概念差异对于心理表征很重要。
此外,支持关系的模式可能在Customer
和Order
表中以不同方式表示。例如,如果客户有列id
和name
:
id,name
1,Bill Smith
2,Jim Kenshaw
然后,如果Order
与Customer
关联,则许多SQL实现会在Order
表中添加一列,用于存储关联{{1}的id
(在此架构中Customer
:
customer_id
在上述数据行中,如果我们查看id,date,amount,customer_id
10,20160620,12.34,1
11,20160620,7.58,1
12,20160621,158.01,2
id列,我们会看到customer_id
(customer-id#1)有2个与他关联的订单:一个是12.34美元,一个是$ 7.58 Bill Smith
(customer-id#2)只有1个订单,价格为158.01美元。
重要的是要意识到,通常一对多关系实际上不会向表中添加任何列,即“一”。 Jim Kenshaw
没有额外的列来描述与Customer
的关系。实际上,Order
可能与Customer
和ShippingAddress
表之间存在一对多关系,但没有向SalesCall
表添加其他列。
但是,对于要描述的多对一关系,通常会在“many”表中添加Customer
列,这是“one”表的外键 - 在这种情况下id
列添加了customer_id
列。要将$ 12.34与Order
相关联的订单#10,我们会将Bill Smith
列分配给customer_id
的ID为1。
但是,也可能有另一个描述Bill Smith
和Customer
关系的表,因此不需要向Order
表添加其他字段。可以Order
表包含customer_id
和Order
的密钥,而不是向Customer_Order
表添加Customer
字段。
Order
在这种情况下,一对多和多对一都是概念性的,因为它们之间没有架构更改。哪种机制取决于您的架构和SQL实现。
希望这有帮助。
答案 3 :(得分:6)
回答你的第一个问题是:两者都相似,
回答你的第二个问题是:一对多 - > MAN(MAN表)可能有多个妻子(WOMEN表)多对一 - >不止一个女人嫁给了一个男人。
现在,如果要将此关系与两个表MAN和WOMEN关联,则一个MAN表行可能与WOMEN表中的行有很多关系。希望它清楚。
答案 4 :(得分:4)
没有区别。这只是语言和偏好的问题,关于你在哪种方式陈述关系。
答案 5 :(得分:2)
一对多和多对一在多重性方面相似,但不是方面(即方向性)。
实体类之间的关联与表之间的关系的映射。关系有两类:
答案 6 :(得分:2)
在SQL中,只有一种关系,它称为引用。 (您的前端可能会做些有用或令人困惑的事情(例如在某些《答案》中,但这是另一回事。)
在SQL术语中,栏引用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中,(上面的)全部是必需的。
一对多
您需要 Transaction 来强制在“引用”表中进行操作。
一对零(一对零)
您需要在Bar
:
CONSTRAINT AK -- constraint name
UNIQUE (Foo) -- unique column, which makes it an Alternate Key
一对一
您需要 Transaction 来强制在“引用”表中进行操作。
多对多
在物理级别上没有这样的东西(回想一下,SQL中只有一种类型的关系)。
在建模练习的早期逻辑层次上,绘制这样的关系很方便。在模型接近实现之前,最好将其提升为仅使用可以存在的事物。通过实现关联表可以解决这种关系。
答案 7 :(得分:1)
这是一个很好的问题,根据我的经验,在 ERD 图表和关系数据库中暗示了方向。在 RDBMS 中,您总是定义多对->一(普通情况下一对->一)关系。关系的多方面,又名孩子,引用一方,又名父母,你用外键约束来实现它。从技术上讲,您必须访问索引,获取一侧的主键记录,然后访问该记录以获取更多信息。
除非我们谈论对象关系 DBMS,例如 Postgres、Intersystems Cache 等,否则您不能反过来这样做。这些 DBMS 允许您定义两个实体(表)之间的双向关系。在这种情况下,以相反的方式访问记录,即 One--To-->Many 是通过使用引用数组(子项)来实现的。在 ORM 中,您的类以我们在此处描述的相同方式相互引用。
警告:严格来说,IT 市场中的大多数 RDBMS 都不是关系数据库管理系统,请考虑空值、重复记录等,其中许多允许的功能破坏了关系的定义。
答案 8 :(得分:0)
没有实际的区别。正如Devendra所说明的那样,只要根据你看待问题的方式使用最有意义的关系。
答案 9 :(得分:0)
---多对一---这三个孩子可以有一个父母。
两者都相似。这可以用于属于需要。如果你想为特定的父母找到孩子,那么你可以和一对多一起去。或者,想要找一对双胞胎的父母,你可以选择多对一。同样...,
答案 10 :(得分:0)
一对多和多对一关系在谈论相同的逻辑关系,例如,一个所有者可能有很多房屋,但是一个房屋只能有一个所有者。
因此,在此示例中,所有者是一个,房屋是多个。 每个家庭总是有一个owner_id(例如外键)作为额外的列。
这两者之间在实现上的区别在于哪个表定义了关系。 在一对多中,所有者是定义关系的地方。例如,owner1.homes列出所有具有owner1的owner_id的房屋 在多对一中,定义关系的位置是“家”。例如,home1.owner列出了owner1的owner_id。
我实际上不知道在什么情况下会实现多对一的安排,因为您已经知道owner_id似乎有点多余。也许与删除和更改的整洁有关。
答案 11 :(得分:0)
我可以对这种关系给出的最简单的解释是捎带evendra D. Chavan's
answer。
一个部门可以有多个员工,所以从员工方面看是one-to-many
关系,从部门方面看是many-to-one relationship
但是如果一个员工也可以属于多个部门,我们也可以从员工方面说现在是many
而不是one
,所以关系变成many-to-many
< /p>
换句话说,一个简单的理解是,如果可以从双方看到 many-to-many
,我们可以说关系是 one-to-many
那就是如果;
one-to-many
)one-to-many
)答案 12 :(得分:-6)
一对多父类包含n个子元素,因此它是一个集合映射。
多对一有n个子级包含一个父级,因此它是对象映射