7.4 从实体集中删除冗余属性
7.4 从实体集中删除冗余属性
当我们**使用E-R模型设计数据库时,我们通常从确定那些应当包含的实体集开始
**。例如,在我们迄今所讨论的大学机构中,我们想要包含如 student
和 instructor
等实体集。当决定好实体集后,我们必须挑选适当的属性,这些属性要表示我们在数据库中所捕获的不同的值。在大学机构中,我们为instructor
实体集设计了包括ID
,name
, dept_name
以及 salary
几个属性,我们还可以增加 phone_number
,office_number
, home_page
等属性。要包含哪些属性的选择决定于了解企业结构的设计者。
一旦选择好实体和它们相应的属性,不同实体间的联系集就建立起来了。这些联系集有可能会导致不同实体集中的属性冗余,并需要将其从原始实体集中删除。
为了说明这一点,考虑实体集instructor
和department
- 实体集
instructor
包含属性ID
,name
,dept_name
以及salary
,其中ID
构成主码 - 实体集
department
包含属性dept_name
,building
以及budget
,其中dept_name
构成主码。
老师-系联系集
我们用关联instructor
和department
的联系集inst_dept
对每个教师
都有一个关联的系
的情况建模。
属性dept_name
在两个实体集中都出现了。由于它是实体集department
的主码,因此它在实体集instructor
中是冗余的,需要将其移除。
从实体集instructor
中移除属性dept_name
可能不是那么直观,因为我们在前几章所用到的关系instructor
中具有dept_name
属性。我们将在后面看到,当我们从E-R图构建一个关系模式时,只有当每个教师最多只与一个系关联时,属性dept_name
才会添加到关系instructor
中。如果一个教师有多个关联的系时,教师与系之间的联系会记录在一个单独的关系inst_dept
中。
将教师
和系
之间的关联统一看成联系,而不是instructor
的一个属性,使得逻辑关系明确,并有助于避免过早地假设每个教师只与一个系关联。
学生-系联系集
类似地,实体集student
通过联系集student_dept
与实体集department
关联,因而student
中不需要dept_name
属性。
作为另一个例子,考虑开课(section
)和开课的时段。每个时段都由time_slot_id
标识,并且和上课时间的集合相关联,每次上课时间都由星期几,开始时间以及结束时间标识。我们打算使用多值复合属性对上课时间集合建模。假设我们对实体集section
和time_slot
按以下方式建模:
- 实体集
section
包含属性course_id
,sec_id
,semester
,year
,building
,room_number
以及time_slot_id
,其中(course_id,sec_id,year,semester)
构成主码。 - 实体集
time_slot
包含主码属性time_slot_id
,以及一个多值复合属性{(day,sant_time,end_time)}
这些实体通过联系集sec_time_slot
相互关联。
属性time_slot_id
在两个实体集中均出现。由于它是实体集time_slot
的主码,因此它在实体集section
中是冗余的,并且需要将其删除。
作为最后的例子,
假设我们有一个实体集classroon
,包含属性building
,room_number
以及capacity
,主码由building
和room_number
组成。
再假设我们有一个联系集sec_class
,将section
和classroom
关联在起。那么属性{building, room_number}
在实体集section
中是冗余的。
总体设计
一个好的实体-联系设计不包含冗余的属性。
实体集
对于我们的大学的例子,我们在下面列出实体集以及它们的属性,主码以下划线标明。
classroom
:包含属性(building,room_number,capacity)
department
:包含属性(dept_name,building, budget)
。course
:包含属性(course_id, title, credits)
。instructor
:包含属性(ID,name, salary)
。section
:包含属性(course_id, sec_id, semester,year)
。student
:包含属性(ID,name, tot_cred)
。time_slot
:包含属性(time_slot_id,{(day, start_time, end_time)})
。
联系集
我们设计的联系集如下。
inst_dept
:关联教师和系stud_dept
:关联学生和系。teaches
:关联教师和开课。takes
:关联学生和开课,包含描述性属性grade
course_dept
:关联课程和系。sec_course
:关联开课和课程。sec_class
:关联开课和教室。sec_time_slot
:关联开课和时段advisor
:关联学生和教师。prereg
:关联课程和先修课程。
你可以验证没有任何一个实体集包含由联系集而造成冗余的属性;另外,你可以验证我们此前在第2章的图2-8中看到的大学数据库关系模式中的所有的信息(除了约束)全部包含在上述的设计中,只是关系设计中的几个属性被ER
设计中的联系所替代。