弱实体可以有主键吗?

shi*_*les 5 erd database-design

对不起,可能是一个非常基本的问题,但在文献和网上,我遇到了弱实体的两种不同定义,有时可能是矛盾的。

1) 弱实体是一个没有其他(所有者)实体就不能存在的实体。
2) 弱实体没有主键,只有部分键,并且只能通过将此部分键与来自所有者实体的外键组合来唯一标识。

其中哪一项是真的?让我们以客户->订单关系为例,其中订单具有唯一的订单 ID。这里没有客户就不能存在订单,但它仍然有自己的主键。那么它是一个强实体还是一个弱实体?

Mic*_*een 6

主键是一种将单个表中的一行与同一表中的所有其他行区分开来的方法。这不是一种将关联行上下文中的一行与其他表区分开的方法。

有时,表的主键由单个列组成。一个人的 user_id 就是一个例子。

有时它由几列组成。位置既是纬度又是经度。这称为复合键。有时,这些列中的一个或多个也可能是外键。这被称为弱实体类型。

以您的示例为例 - 是否可以仅通过订单号将订单表中的一行与所有其他行区分开来?通常,是的。订单号在整个系统中是唯一的。因此,给定订单号 8765,我们知道这是针对客户 A 的。这使得 Order 成为一个强大的实体类型。

OrderLine 表怎么样?给定一个订单行号,比如“1”,我们能否明确地找到与哪个订单相关的订单?通常不会,因为每个订单的订单行号都会重新开始。OrderLine 因此是一个弱实体,因为它的主键(订单号、订单行号)需要来自另一个相关表的主键,即。命令。

因此,根据业务规则,没有客户的订单存在是没有意义的,但根据数据库规则,这是可以的。在任一规则集下,没有订单就不能存在订单行。


ind*_*iri 5

它们都是正确的定义。订单是一个强大的实体。它独立存在。然而,OrderItems 会很弱。它有一个订单号(外键)和一个行号(部分键)。它仅与两者唯一标识。

弱实体具有复合主键。

http://www.ques10.com/p/3828/we-can-convert-any-entity-set-to-a-strong-entity-s/

考虑一个实体集 Payment,它具有三个属性:payment_no、payment_date 和 payment_amount。虽然每个支付实体是不同的,但不同贷款的支付可能共享相同的支付编号。因此,这个实体集没有主键,它是一个实体集。每个弱集必须是一对多关系集的一部分。需要弱实体集的原因如下:

  1. 避免复制强实体的key造成的不一致。

一世。虽然弱实体集可以通过简单地添加适当的属性转换为强实体集,但这种方法会导致主键的冗余存储。

ii. 弱实体集的主键可以从它与强实体集的关系中推断出来。如果我们将主键属性添加到弱实体集中,它们将同时出现在实体集和关系集中,并且它们必须相同。

三、因此,ER图中会有冗余,我们失去了依赖的概念。

四、在上面提到的示例中,将主键属性添加到弱实体集 Payment 导致主键的冗余存储。

  • 另请参阅 Bill Karwin 在相关问题中的回答:[识别和非识别关系之间有什么区别?](/sf/ask/53405621/非识别关系/762994#762994) (2认同)