SQL 上的强实体类型与弱实体类型

mat*_*oyy 0 mysql mariadb normalization database-design table

我有一个 3NF 规范化数据库设计,并试图理解强实体类型与弱实体类型的概念,我的理解是弱实体类型是没有主键的表。但是,所有表都应该有一个主键,从而使它们成为一个强大的实体吗?那么我所有的表都是强实体吗?或者我错过了什么?

重新思考,我的连接表有复合键,(在 maria db 中也制作了一个复合键,您执行 PRIMARY KEY(column1, column2)),那么这些类会作为弱实体吗?

数据库设计: 在此输入图像描述

Bil*_*win 5

我在博客和教程中看到弱实体“没有主键”,但这是误导性的。

您是正确的,每个表都需要一个主键。这对于使表具有关系资格是必要的。每个关系都有一个或多个候选键,并且选择其中一个候选键作为表的主键。候选键的含义是列非 NULL,它们可用于唯一标识表中的任何行。

术语“弱实体”用于表示如果不引用某些“父”实体就无法存在行的表。例如,您可能有表格UsersPhones以便用户可以拥有零部、一部或多部电话。但是,如果不引用其所属用户,电话号码就不可能存在。

因此Users是一个强大的实体;用户表中的一行可以存在,无论它有多少部电话,或者即使没有电话引用它。

Phones是一个弱实体。给定的电话号码不能存在,除非它引用 中的行Users

在 SQL 中实现此目的的一个好方法是要求表的主键Phones包含对 中行的主键的引用User。但一个用户可能拥有多部手机,因此需要额外增加一列来Phones使其成为复合主键。这通常称为鉴别器,它只是一个任意值,对于属于给定用户的每部手机来说都是不同的。它不一定有任何其他含义,但有时人们将其用作显示电话的序数词。

例子:

CREATE TABLE Phones (
  owner_id INT NOT NULL,
  phone_ordinal INT NOT NULL,
  phone_number VARCHAR(32) NOT NULL,
  phone_type VARCHAR(16) NOT NULL,
  PRIMARY KEY (owner_id, phone_ordinal),
  FOREIGN KEY (owner_id) REFERENCES Users(user_id)
);
Run Code Online (Sandbox Code Playgroud)

有些人将此称为“电话没有主键”,但他们的意思是它没有自己的自动递增整数列。它取决于表主键中的值Users

许多软件开发人员将“主键”与“名为 的自动递增整数列id”混淆。这是对主键的误解。主键是应用于一个或多个列的约束,这些列一起构成表的候选键。它并不一定意味着主键是单列,或者它是一个整数,或者它是自动递增的。


PS 我想澄清的是,对主键使用自动增量并不是强实体的标准。关系模型根本不需要自动增量,它只是一种流行的便利。