实体与实体集
- 实体是可识别的“事物”。命名的框表示一组实体或实体集。 属性、值与值集 E-R模型是以值为导向的。值可以是整数、字符串或原子。
属性、价值和价值集
- E-R 模型以价值为导向。值 可以是整数、字符串或原子。
实体的属性
- 实体可以拥有属性。同一实体集中的所有实体具有相同的属性。 然而,属性对每个实体来说都取不同的值。
关系与关系集
- 一个菱形代表一组关系或一个关系集。
- 一个关系关联两个实体(也可以是0个或更多)。一个关系集是一组关系,将来自同一实体集的实体关联起来。
- 一个关系关联2个或更多实体。一个关系集是一组关系,将来自同一实体集的实体关联起来。
关系的属性
- 关系可以拥有属性。同一关系集中的所有关系具有相同的属性。
- 关系的区别不在于它们的属性,而在于它们的参与实体。
关系与关系集
- 关系可以将来自同一实体集的实体关联起来。在这种情况下,一般来说,参与关系的角色可以被命名。
- 一个关系可以关联少于或多于2个实体。 我们称之为n元关系。
实体的身份
- 一个属性可以标识实体。这是实体集中所有实体的属性。 注意:至少所有属性可以标识实体。
- 属性的组合可以标识实体。
- 可能有几种属性组合可以标识一个实体。
- 注意:至少所有属性都能识别实体,但我们可能更喜欢最小的属性
弱实体
- 一些实体只能在与另一个实体集的关系范围内被标识。请注意,关系必须存在并且对集合中的每个实体都是唯一的。
- 学号 由大学提供。相同的号码可以被不同的大学使用。
- 大学是一个主导实体。我们需要知道大学才能识别学生。 学生是一个弱实体。它不能仅凭其属性被识别。
关系的参与和基数
(1, x) 表示强制参与。
(0, x) 表示可选参与。
(x, 1) 对于所有涉及的实体表明一对一的关系。
(x, 1) 对于一个涉及的实体和 (x, N) 或 (x, y) y > 1 对于其他实体表明一对多的关系。
(x, N) 或 (x, y) y > 1 对于所有涉及的实体表明多对多的关系。
关系的基数
- 参与关系的基数可以通过最小值和最大值来约束:(1,1), (0, n), (2, 5)
- 另一个例子:学术工作人员可以指导最多5名研究生。有些工作人员不指导学生。研究生可以有一位或两位导师。
- 默认情况下,我们有多对多的关系。
- 一对一关系的例子。
弱实体
- 弱实体只能针对被(1,1)基数约束的参与定义。也称为强制一对多关系。
规则1:
- 值集 值集映射到域。在实践中,这是向物理设计迈出的第一步。E-R属性映射到关系的属性。
规则2:
- 实体集 实体集映射到关系。实体集的属性映射到关系的属性。键映射到主键。
CREATE TABLE company(
name VARCHAR(64) PRIMARY KEY,
address VARCHAR(128) NOT NULL);
CREATE TABLE person (
first name VARCHAR(32),
last_name VARCHAR(32),
address VARCHAR(128) NOT NULL,
PRIMARY KEY (first_name, last_name));
规则3:
关系集 关系集映射到关系。关系的属性由关系集的属性以及参与实体的键组成。
CREATE TABLE contract(
start DATE NOT NULL,
end DATE NOT NULL,
object VARCHAR(128) NOT NULL,
pfirst_name VARCHAR(32),
plast_name VARCHAR(32),
cname VARCHAR(64),
PRIMARY KEY (pfirst_name, plast_name, cname),
FOREIGN KEY (pfirst_name , plast_name)
REFERENCES person(first_name, last_name),
FOREIGN KEY (cname) REFERENCES company(name));
例外 1:一对多关系
CREATE TABLE work_for(
start DATE NOT NULL,
end DATE NOT NULL,
enumber CHAR(8) PRIMARY KEY,
cname VARCHAR(32) NOT NULL,
FOREIGN KEY (enumber) REFERENCES employee(number),
FOREIGN KEY (cname) REFERENCES company(name));
我们更改了关系表的主键或添加了 UNIQUE 约束。
例外 2:(1,1)参与限制
我们合并雇员表和 work_for 表,并使用雇员表的主键。
CREATE TABLE employee_work_for (
start DATE NOT NULL,
end DATE NOT NULL,
enumber CHAR(8) PRIMARY KEY,
ename CHAR(32) NOT NULL,
cname VARCHAR(32) NOT NULL,
FOREIGN KEY (cname) REFERENCES company(name));
例外 3:弱实体
我们合并表 employee 和表 work_for,并使用弱实体的主键。
CREATE TABLE employee_work_for(
start DATE NOT NULL,
end DATE NOT NULL,
enumber CHAR(8),
ename CHAR(32) NOT NULL,
cname VARCHAR(32),
PRIMARY KEY (enumber, cname),
FOREIGN KEY (cname) REFERENCES company(name));