简单博客系统 mysql数据库设计 百度网盘_Java简单博客系统(一)基于实体联系模型设计数据库...

本文探讨了数据库设计的基本概念,如实体集、联系集、属性类型,并展示了如何将这些概念转化为关系模型。通过分析,发现原始设计不满足第三范式,于是进行了模式分解以达到规范化。然而,考虑到性能因素,决定在博客表中保留用户名,实现去规范化。此外,还讨论了是否需要创建博客类型表,取决于具体业务需求。最后,提到了使用SQLyog工具建立数据库的实践。
摘要由CSDN通过智能技术生成

基本概念

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

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

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

最简单的博客系统

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

c08dfbe3566957246d90d1028f7513d5.png

(二)联系集:

ca36ac7f620be38f0a2a769faaf8f833.png

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

实体集:

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

3f4daec3533405a6c5b3013b2fce534d.png

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

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

684beac0cd83a505a9e4037ca6449d62.png

博客表:blog

e80676fed030012467eea51b3ab2164a.png

外码约束

dde3b91dfd835ce6c4e828e73aaf7271.png

评论表:comment

cbc3c3a27b2115f4bd64cc0bc7acaf05.png

外码约束

1eece46309916b28fc56d114f95dd27b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值