一对多和多对一关系的真正区别是什么?它只是反向的,是什么样的?
除了本主题之外,我没有找到关于此主题的任何“好理解”教程:初学者使用的SQL:第3部分-数据库关系
一对多和多对一关系的真正区别是什么?它只是反向的,是什么样的?
除了本主题之外,我没有找到关于此主题的任何“好理解”教程:初学者使用的SQL:第3部分-数据库关系
Answers:
是的,反之亦然。它取决于实体存在于关系的哪一侧。
例如,如果一个部门可以雇用多名员工,则部门与雇员之间是一对多的关系(1个部门雇用许多雇员),而雇员与部门之间的关系则是多对一的关系(许多雇员在一个部门中工作)。
有关关系类型的更多信息:
表之间的大多数关系是一对多的。
例:
- 一个地区可以成为许多读者的栖息地。
- 一个读者可以有许多订阅。
- 一份报纸可以有很多订阅。
一对多关系与一对多关系相同,但是观点不同。
- 许多读者住在一个地区。
- 许多订阅可以是同一读者。
- 许多订阅是针对同一份报纸。
一对多和多对一关系的真正区别是什么?
这些术语之间存在概念上的差异,应该可以帮助您可视化数据,并且所生成的架构中的可能存在的差异也应该被完全理解。通常,差异是透视图之一。
在一对多关系中,本地表具有一行,该行可能与另一表中的许多行相关联。在SQL的初学者示例中,一个Customer
可能与许多Order
s。
在相反的多对一关系中,本地表可能具有与另一表中的一行关联的许多行。在我们的示例中,许多Order
可能与一个Customer
。这种概念上的差异对于心理表征很重要。
此外,可以在Customer
和Order
表中以不同方式表示支持该关系的架构。例如,如果客户具有列id
和name
:
id,name
1,Bill Smith
2,Jim Kenshaw
然后,要使a Order
与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
(客户ID#2)只有1个订单,价格为$ 158.01。
重要的是要意识到,通常一对多关系实际上并未向表中添加任何为“一个”的列。的Customer
没有多余的列描述与的关系Order
。实际上,它们Customer
可能与ShippingAddress
和SalesCall
表也具有一对多的关系,但是没有向Customer
表中添加其他列。
但是,对于要描述的多对一关系,通常将一id
列添加到“许多”表中,该列是“一个”表的外键-在这种情况下,将customer_id
列添加到中Order
。对于关联的订单10(价格为$ 12.34)Bill Smith
,我们将customer_id
列分配给Bill Smith
ID为1。
但是,也可能有另一个表描述Customer
and Order
关系,因此无需在该Order
表中添加其他字段。不是添加的customer_id
字段的Order
表,可能有Customer_Order
表,其中包含两个按键Customer
和Order
。
customer_id,order_id
1,10
1,11
2,12
在这种情况下,一对多和多对一都是概念性的,因为它们之间没有架构更改。哪种机制取决于您的架构和SQL实现。
希望这可以帮助。
javax.persistence.OneToMany
与Java 不同ManyToOne
。您是说它们是同义词,还是仅取决于实现?我的答案不正确吗?
没有区别。关于您陈述该关系的方式,只取决于语言和偏好。
在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中,(以上所述)全部是必需的。
一对多一对多
您需要一个事务来强制执行“引用”表中的一个事务。
一对一到零比一,
您需要Bar
:
CONSTRAINT AK -- constraint name
UNIQUE (Foo) -- unique column, which makes it an Alternate Key
一对一
您需要一个事务来强制引用表中的一个事务。
多对多
在物理级别上没有这样的东西(回想一下,SQL中只有一种类型的关系)。
在建模练习的早期逻辑级别,可以方便地绘制这种关系。在模型接近实现之前,最好将其提升为仅使用可以存在的事物。通过实现关联表可以解决这种关系。
一对多和多对一在多重性上相似,但在长宽比(即方向性)上却不相似。
的映射关联实体类和之间的关系的表之间。有两类关系:
没有实际的区别。就像使用Devendra所说明的那样,只要使用最有意义的关系即可。
一对多父类包含n个孩子,因此它是一个集合映射。
多对一的 n个孩子包含一个父对象,因此它是对象映射