基本概念

简单属性:不能划分为更小的部分(其他属性)。

单值属性:一个特定实体有只有单独的一个值。

派生属性:可以从别的相关属性或实体派生出来。

最简单的博客系统

(一)实体集:用户,博客,评论,实体及其属性列出如下:

Java 生成大模型向量库_Java 生成大模型向量库

(二)联系集:

Java 生成大模型向量库_用户名_02

以上设计的实体集,联系集表示如下:(派生属性不存储,在需要时计算出来)

实体集:

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的约束,作为合并后模式的约束。

Java 生成大模型向量库_实体集_03

(四)基于数据库范式检验模式的设计

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

Java 生成大模型向量库_数据库_04

博客表:blog

 

Java 生成大模型向量库_Java 生成大模型向量库_05

外码约束

Java 生成大模型向量库_数据库_06

 

评论表:comment

 

Java 生成大模型向量库_用户名_07

外码约束

Java 生成大模型向量库_实体集_08