基本概念
简单属性:不能划分为更小的部分(其他属性)。
单值属性:一个特定实体有只有单独的一个值。
派生属性:可以从别的相关属性或实体派生出来。
最简单的博客系统
(一)实体集:用户,博客,评论,实体及其属性列出如下:
(二)联系集:
以上设计的实体集,联系集表示如下:(派生属性不存储,在需要时计算出来)
实体集:
user:包含属性(useId,name,password,motto,points,registerDate)
blog:包含属性(blogId,authorName,title,content,blogType,createTime,views,likes)
comment:包含属性(commentId,authorName,content,reviewTime)
联系集:
user_blog:关联用户和博客
user_comment:关联用户和评论
blog_comment:关联博客和评论
(三)实体联系模型转化为关系模型
1.具有简单属性的强实体集的表示:该模式关系中每个元组同实体集E的一个实体相对应,强实体集的主码就是生成的模式的主码。
2.联系集的表示:模式中的属性为参与该联系及的实体主码集合和该联系描述性属性(如果有)的并集主码:
多对多的二元联系:参与实体集的主码属性的并集;
一对多:“多”的一方的实体集的主码;
一对一:任一个实体集的主码;
基于以上原则,得到的关系模式如下所示:
user((useId,name,password,motto,pointsregisterDate));
blog(blogId,authorName,title,content,blogType,createTime,views,likes)
comment(commentId,authorName,content,reviewTime)
user_blog:(useId,blogId)
user_comment:(useId,commentId)
blog_comment:(blogId,commentId)
(四)模式的合并
1.实体集A到实体集B映射基数是多对一,联系集是AB,得到三个模式A,B,AB;
2.实体集A在联系中是全部参与的(即:实体集A中每个实体a都必须参与到联系AB中)
满足以上条件,则可以将模式A和模式AB合并成包含两个模式所有属性并集的单个模式,合并后的主码是A的主码和AB主码的并集。
模式合并后的外码约束:
舍弃联系集AB参照实体集A的约束,仅保留联系集AB参照实体集B的约束,作为合并后模式的约束。
(四)基于数据库范式检验模式的设计
1.第一范式:关系模式中的属性都是简单属性和单值属性,属性不存在任何子结构,属性域是原子,所以满足1NF;
2.BC范式:在关系模式blog和comment中,存在非平凡函数依赖userId->authorName,userId不是blog或者comment的主码,所以是不满足BCNF。
3.第三范式:在非平凡函数依赖中,authorName-userId=authorName,不在关系模式blog或者comment任意一个候选码中。(它们的候选码分别是blogId和commentId) ,所以不满足第三范式。
(五)规范化和去规范化
"按照上面的分析,要满足第三范式,需要对blog和comment数据表进行模式分解:
blog(blogId,userId,title,content,blogType,createTime,views,likes);
comment(comentId,userId,blogId,content,reviewTime);
user(userId,authorName);
原先已经定义了一个user表,所以这里忽略分解出来的模式,得到以下的模式:
user(useId,name,password,motto,points,registerDate);
blog(blogId,userId,title,content,blogType,createTime,views,likes)
comment(commentId,userId,blogId,content,reviewTime)
但在实际应用中,显示博客记录总是需要显示用户名,如果博客表没有用户名属性,则在显示时需要关联用户表进行查询,这会使得页面加载变慢,性能下降。所以在有些情况下,可以允许冗余信息的存在以提升性能。在这种情况下,如果用户名改变了,则需要对博客表进行批量更新。庆幸的是,在实际应用中,一般会设计成用户名唯一且不可变的。所以在这里可以去规范化,保留博客表中的用户名。
(六)其他
是否应该建立博客类型(bookType)表?
如果有将博客进行分类显示的需求,则应该建立博客类型数据表;如果没有这个需求,则可以不建立。
(七)借助SQLyog工具建立数据库db_blog,三个数据表及外键约束
用户表:user
博客表:blog
外码约束
评论表:comment
外码约束