时间:2014.04.18
地点:基地
--------------------------------------------------------------------
构建一个数据库应用是一个非常复杂的任务,包括有设计数据库的模式,设计访问和更新数据的程序以及设计控制数据访问的安全模式。数据库的预期用途在很多方面都影响着物理级,逻辑级和视图级的各种各样的选择。
--------------------------------------------------------------------
一、设计阶段
1.初级阶段(理解需求):
完整地刻画未来数据库用户的数据用户的数据需求。——因为现实的应用往往非常复杂,所以数据库设计者应该与应用的用户进行交互以理解应用需求,并把它以用户能理解的高级形式表现出来,然后再将需求转化为较低级别的设计。所以设计者应该和应用领域专家和用户深入沟通,列出需求规格说明。
2.概念设计阶段(将需求转化为概念,构建实体-联系图):
选择数据模型,采用该模型的概念将需求转化为数据的概念模式。——这是一个概念设计阶段,比如我们常用的实体-联系模型,该模型定义了数据库中表示的实体,实体的属性,实体之间的联系,以及实体和联系上的约束。概念设计阶段的结果是构建一个实体-联系图,提供对模式的图形化描述。这一阶段,关注的是描述数据及其联系,而不是定义物理存储的细节,且要确保在该模式下的数据满足需求。
3.概念设计阶段(功能需求规格说明,包括修改更新数据,搜索取回数据和删除数据等)
以上步骤均属于抽象数据库实现,而数据库的实现则包括逻辑设计阶段,物理设计阶段
4.逻辑设计阶段:
设计者将高层概念模式映射到将使用的数据库系统实现的数据模型上。实现数据模型通常是关系数据模型。这个映射一般是:将实体-联系模型定义的概念模式映射到关系模式中。
5.物理设计阶段
设计者将所得系统特定的数据库模式使用到后续的物理设计阶段。这一阶段指明数据库的物理特征,包括文件组织格式和索引结构的选择。
--------------------------------------------------------------------
二、设计选择
实体是用于描述和指示数据库中所有可明确识别的个体,比如一个大学数据库中的老师,学生,系,课程等都是实体。这些实体之间又涉及各种各样的相互关系,这些关系都将在数据库的设计过程中得到反映。
设计数据库时应该避免的两个缺陷
1.设计冗余
不好的数据库设计可能会重复信息。信息冗余会带来的问题是当对一条信息进行更新时没有将这条信息存在的冗余部分进行及时更新,那么后果是两份本来都是表达同一含义时会由此而变得不一致。理想情况下,信息应该只出现一次,不应该冗余。
2.设计不完整
总之,数据库设计其实是一个很有挑战性的问题,需要科学和好的品味的结合。
--------------------------------------------------------------------
三、实体-联系模型(E-R)
数据库模型旨在方便数据库的设计,通过允许定义代表数据库全局逻辑结构的企业模式实现。
E-R模型的几个概念:
1.实体集
实体是现实世界中可区别于所有其他对象的一个事物或对象。比如:大学中的每个个体都是一个实体,可区别于他人,每个实体也都有一组性质,其中某些值还可以唯一的标识一个实体,至少在某个实体集合中可以如此,比如学号,身份证号等。
实体集即相同类型或相同性质的一个实体的集合。例如可以给一个大学中所有的教师定义为一个实体集,把所有的教师都装到里面。同时,实体集的外延是指:实体集中的实体的实际集合,有点拗口了,具体来说:实体集中肯定有好多实体,而该实体集中实际上存在的实体组成的集合就是该实体集的外延。
实体是通过一组属性来表示的,属性描述了实体集中每个成员所拥有的性质。每个实体在每个属性上都有各自的值。
由此说来,数据库是包括一组实体集,每个实体集包括任意数量的相同类型的实体,比如大学数据库中包含的两个实体集:教师和学生,这两个实体集中都有各自的实体组成。并配备相应的属性。当然还有更多实体集,比如课程啊,学院啊等等。
2.联系集
联系是指多个实体间的相互关联。比如可以定义某教师X和某学生Y的联系,该关联指明了教师X是学生Y的导师。
联系集:是相同类型联的得集合,它对应了一种关系下的所有实现的集合,比如在实体集教师和实体集学生之间,存在教师和学生的一个关系,将这很多种师生关系的映射集合在一块,就是一个联系集。这时我们还说,实体集教师和实体集学生参与了这一个联系集。比如:一个教师ID为201314的教师实体和一个学号为201208的学生实体参与到师生联系得一个联系实例中,该联系实例表明这位教师是这位学生的导师。
另外,联系也可以具有属性,比如实体集教师和实体集学生之间的联系集师生关系,我们可以在师生关系上建立一个属性,表示师生关系的起始日期,在比如实体集学生和课程集课程,可以在这个联系集上用一个分数属性,来记录学生期末在这门课程中所取得的成绩。值得注意的是,联系集中的实例是通过参与实体唯一标识的,与描述属性无关。相同的实体集也可能会参与多余一个的联系集中去。
联系集中,大部分都是二元的,即只涉及两个实体参与到联系集。有时也有可能会多余两个。参与联系集的实体集的数目叫做联系集的度,二元联系集的度为2。
3.属性
上面已经提到过属性,每个属性都有一个可取值得集合,称为属性的域,或者说值集,域更好听吧。如函数的定义域和值域。在这里,实体集的属性就是将实体集映射到域的函数。因为一个实体集可能有多个属性,因为每个实体一般用一组(属性,数据值)对来表示。比如教师实体可用集合 {(ID,201314),(name,John),(dept_name ,information),(salary,72000)}来描述。
3.1简单属性和符合属性
简单属性是不能再划分的属性,而复合属性可以,比如属性name,可以划分为更小的属性,first_name,middle_namd,last_name。这样的话是name就是符合属性,当然这是设计者自定义的,而不是一成不变的,如果你定义认为name是一个整体不可再分,那么它就是简单属性。如果一个用户希望在一些场景中引用完整性属性,而在另外一些场景中仅需要属性的一部分,则在设计模式中使用复合属性是一个很好的选择。比如在大学数据库中,实体集学生中可增加一个地址属性,而该地址属性又可细分为:省,市,县等子属性。
3.2单值属性和多值属性
一般来说属性对一个特定实体只有一个单独的值,比如对于特定实体学生而言它只有一个学号,这个学号属性是单值得。而某些情况下,比如联系电话,这时对于特定实体也是可以取多个值得,在表达多值属性时,我们用花括号将属性名括住,比如:{phone_number},另外我们还可以为这种多值性设置上限或下限。
3.3派生属性
派生属性的值可以从别的相关属性和实体派生而来,比如实体集教师和属性 学生数量,用于表示对应教师指导的学生数目,这个学生数目是通过统计与一个教师相关联的所有学生实体的数目得到的属性值,这样的属性叫派生属性。在比如,实体集教师已经有年龄属性age,如果想还有个出生日期属性 date_of_birth,那么我们可以从当前的日期和date_of_birth通过计算得到age了,这样age就是派生属性了,而date_of_birth就叫做基属性,或存储属性。
总的一句话来说:派生属性的值无需存储,而是在需要时被计算。 属性没有值时用null表示。