7.4 从实体集中删除冗余属性

7.4 从实体集中删除冗余属性

当我们**使用E-R模型设计数据库时,我们通常从确定那些应当包含的实体集开始**。例如,在我们迄今所讨论的大学机构中,我们想要包含如 studentinstructor等实体集。当决定好实体集后,我们必须挑选适当的属性,这些属性要表示我们在数据库中所捕获的不同的值。在大学机构中,我们为instructor实体集设计了包括ID,name, dept_name以及 salary几个属性,我们还可以增加 phone_number,office_number, home_page等属性。要包含哪些属性的选择决定于了解企业结构的设计者。

一旦选择好实体和它们相应的属性,不同实体间的联系集就建立起来了。这些联系集有可能会导致不同实体集中的属性冗余,并需要将其从原始实体集中删除。

为了说明这一点,考虑实体集instructordepartment

  • 实体集instructor包含属性ID,name, dept_name以及salary,其中ID构成主码
  • 实体集department包含属性dept_name, building以及budget,其中dept_name构成主码。

老师-系联系集

我们用关联instructordepartment联系集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标识,并且和上课时间的集合相关联,每次上课时间都由星期几,开始时间以及结束时间标识。我们打算使用多值复合属性对上课时间集合建模。假设我们对实体集sectiontime_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,主码由buildingroom_number组成。
再假设我们有一个联系集sec_class,将sectionclassroom关联在起。那么属性{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设计中的联系所替代。