数据库——书籍+内容0.1版本

news2024/12/25 22:07:47

背景:将一本书,存入我们的数据库中,并可以查出来

采用:第三范式(3NF)设计模式

设计数据库模板
  1. 第一范式(1NF):确保表的每一列都是不可分割的原子数据项。

  2. 第二范式(2NF):在满足第一范式的基础上,非主键列必须完全依赖于整个主键,而不是主键的一部分。

  3. 第三范式(3NF):在满足第二范式的基础上,非主键列之间不存在传递依赖关系,即一个非主键列不能依赖于另一个非主键列。

我们通过迭代,一步一步完成到第三范式

第一步:分析书籍是由什么组成的,这样我们才能更好的完成第一范式。

身边有书就拿起书,没书咱们就感谢前辈的努力(crrl+左键)PS:文字作者的休闲时刻奇妙幻想

第一眼,我们可以看见一个叫封面

第二眼,我们可以看见一个叫书名

第三眼,我们可以看见作者的名字

第四眼,侧边有一个出版社(实体书)

第五眼,侧边话还有一个时间

第六眼,书的背面有大佬点评(实体书)

第七眼,我们可以看见字数总和

第八眼,我们可以看见浏览量

第一层组成:封面,书名,作者,出版社,时间,点评,字数,浏览量(我拿三本书看到的信息)

翻开一页,利用上面的那个网站作为例子的,直接看下面就好(点个赞!)

又来了,

第一眼,我们可以看见作者的介绍(目前不涉及)

第二眼,作者写这本书的目的,也就是前言

第二层组成:介绍,前言

再翻几页,我们发现就是那密密麻麻的章节了,没有的按开始提供的网页进行参考

第一眼,我们可以看见加粗的h1标签的章节(凭感觉应该可以看出这个明细是h1打印出来的)

第二眼,每一篇的小标题

第三眼,页数

第三层组成:总章节,每一篇的小标题

第四层就是我们最熟悉的小标题+内容了 

这样我们的第一步就完成了,将四层组合一如下

第一层组成:封面,书名,作者,出版社,时间,点评,字数,浏览量

第二层组成:介绍,前言

第三层组成:总章节,每一篇的小标题

第四层组成:小标题,内容

第二步:在第一步的基础上,完成1nf的分析,不可分割的原子数据项。

第一层:封面,书名,作者,出版社,时间,点评,字数,浏览量,已经完成条件不可分割

第二层:介绍,前言,同上

第三层,第四层一样

第一层1nf代码如下,

CREATE TABLE ak47 (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    cover VARCHAR(255) NOT NULL COMMENT '封面图片路径',  
    title VARCHAR(255) NOT NULL COMMENT '书名',  
    author VARCHAR(255) NOT NULL COMMENT '作者',  
    publisher VARCHAR(255) NOT NULL COMMENT '出版社',  
    publish_date DATE NOT NULL COMMENT '出版时间',  
    review TEXT COMMENT '点评',  
    word_count INT NOT NULL COMMENT '字数',  
    view_count INT DEFAULT 0 COMMENT '浏览量',  
    introduction TEXT COMMENT '介绍',  
    preface TEXT COMMENT '前言',  
    chapter_number INT COMMENT '章节序号',  
    subtitle VARCHAR(255) COMMENT '小标题',  
    content TEXT COMMENT '内容'  
);

第三步:将其化为2nf

在满足第一范式的基础上,非主键列必须完全依赖于整个主键,而不是主键的一部分。

分析一下这句话,核心是必须完全依赖于整个主键

拆出来:必须完全整个主键

整个主键:一整个表只能有一个主键,那么前面这句一整个表好理解,主键是什么呢?

主键:具有代表整个表的关键词(编号,身份证,表单的身份证)

一山不容二虎,除非他是子表

根据这个内容,我们的1nf范式,去进行一个拆解

我们可以分为三大类:第一类:书籍基本信息

                                    第二类:书籍章节

                                    第三类:书籍评价

这一个表就被拆成如下:

第一类:(主键)书籍编号,封面,书名,作者,出版社,出版时间

第二类:书籍编号(父表),书籍章节(主键),章节标题,章节内容,浏览量,字数

第三类:书籍编号(父表),评论ID(主键),评论内容,评论时间

为什么这么拆:封面,书名,作者,出版社,出版时间这些只能通过书籍编号获取,非主键列必须完全依赖于整个主键,

完全依赖,就是指,书名只能通过一个东西去获得,不能通过其他的去得到

第一个原则:重复性,当一个元素能重复时,他就不具有做主键的代表性

所以在选择主键的时候,考虑他可能重复吗?这里我们又可以进行拆一次

第一类:(主键)书籍编号,封面,书名,出版社,出版时间

第二类:作者(主键),作者名字,作者账号,作者简介,作品(父表)

第三类:书籍编号(父表),书籍章节(主键),章节标题,章节内容,浏览量,字数

第四类:书籍编号(父表),评论ID(主键),评论内容,评论时间

这时,作品又可以分类讨论了:一个本书没问题,两本书难不成像文章一样吗,

用《第一本》,《第二本吗》,放在同一个列中吗,很显然不可能

这样看着是不是怪怪的

再分就成五类了

第一类作者信息:作者账号(主键),作者名字,作者简介

第二类书籍信息:(主键)书籍编号,封面,书名,出版社,出版时间

第三类章节信息:书籍编号(父表),书籍章节(主键),章节标题,章节内容,浏览量,字数

第四类评论信息:书籍编号(父表),评论ID(主键),评论内容,评论时间

第五类作者作品:作者编号(父表),书籍编号(父表)

为什么第五类这么拆,我们可以根据查询语句,直接查出父表的内容,说人话就是

父表的内容可以直接被查出来,这样设计就有一点MVC模式了

类拆好了,那么该实现代码了

CREATE TABLE authors (  
    -- 作者账号,作为主键,具有唯一性  
    author_account VARCHAR(255) PRIMARY KEY UNIQUE,  
    -- 作者名字  
    author_name VARCHAR(255) NOT NULL,  
    -- 作者简介  
    author_bio TEXT  
);

第二类

CREATE TABLE books (  
    -- 书籍编号,作为主键,具有唯一性  
    book_id INT PRIMARY KEY UNIQUE,  
    -- 封面  
    cover VARCHAR(255),  
    -- 书名  
    title VARCHAR(255) NOT NULL,  
    -- 出版社  
    publisher VARCHAR(255),  
    -- 出版时间  
    publication_date DATE  
);

第三大类

CREATE TABLE chapters (  
    -- 书籍编号,作为父表引用书籍信息表  
    book_id INT,  
    -- 书籍章节编号,与书籍编号组合作为复合主键,具有唯一性  
    chapter_number INT,  
    -- 章节标题  
    chapter_title VARCHAR(255) NOT NULL,  
    -- 章节内容  
    chapter_content TEXT,  
    -- 浏览量  
    view_count INT DEFAULT 0,  
    -- 字数  
    word_count INT,  
    -- 设置复合主键  
    PRIMARY KEY (book_id, chapter_number),  
    -- 设置父表约束  
    FOREIGN KEY (book_id) REFERENCES books(book_id)  
);

第四类:

CREATE TABLE comments (  
    -- 评论ID,作为主键,具有唯一性  
    comment_id INT PRIMARY KEY UNIQUE,  
    -- 书籍编号,作为父表引用书籍信息表  
    book_id INT,  
    -- 评论内容  
    comment_content TEXT NOT NULL,  
    -- 评论时间,默认为当前时间戳  
    comment_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  
    -- 设置父表约束  
    FOREIGN KEY (book_id) REFERENCES books(book_id)  
);

第五类

CREATE TABLE author_works (  
    -- 作者账号,作为父表引用作者信息表,具有唯一性(与书籍编号组合)  
    author_account VARCHAR(255),  
    -- 书籍编号,作为父表引用书籍信息表,具有唯一性(与作者账号组合)  
    book_id INT,  
    -- 设置复合主键,确保作者与书籍的关联唯一  
    PRIMARY KEY (author_account, book_id),  
    -- 设置父表约束  
    FOREIGN KEY (author_account) REFERENCES authors(author_account),  
    FOREIGN KEY (book_id) REFERENCES books(book_id)  
);

总结2nf的一个原则,不可重复性,当出现了重复性,那么我们就要将其分出来

进入第四步,将其化为3nf

第三范式(3NF):在满足第二范式的基础上,非主键列之间不存在传递依赖关系,即一个非主键列不能依赖于另一个非主键列。

说人话就是,除了主键和父键以外的列,他们是独立存在的,互不影响,就和国家与国家一样,

第一类作者信息:作者账号(主键),作者名字,作者简介

第二类书籍信息:(主键)书籍编号,封面,书名,出版社,出版时间

第三类章节信息:书籍编号(父表),书籍章节(主键),章节标题,章节内容,浏览量,字数

第四类评论信息:书籍编号(父表),评论ID(主键),评论内容,评论时间

第五类作者作品:作者编号(父表),书籍编号(父表)

来来看看父表和主键之外的内容有没有联系

能通过作者名字去确定一个作者的简介吗?很显然不能,因为名字可重复,但是账号不可重复

除非你把账号和作者的名字改一下

A和B之间没有直接的关系,独立,互不影响,但是硬要深挖他们就是属于书的一部分

总结一下:三段范式,是属于叠加态,简称父子关系,而他们的父亲

具体关系如下,1nf是父,2nf是儿,3nf就是孙子

每一代都继承了父代的优势

1nf是原子性,即本质性

2nf是具有原子性,诞生了不可重复性

3nf是具有原子性,不可重复性,独立互不影响性

第一步:拆解,拆解成1

例子:12,就拆成12个1

第二步:确定唯一主键和父键,如果有需求可以再来一个义父键

例子:A,B,C

A是父键,B是主键,C是列

他们直接的联系就是,A是连接B的,B是用来连接C的

第三步:看除主键父键以外的内容,是否是独立互不影响性

0.1版本,2024/3/16数据库3nf范式模板

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1522029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么时候去检测大数据信用风险比较合适?

什么时候去检测大数据信用风险比较合适?在当今这个数据驱动的时代,大数据信用风险检测已经成为个人的一项重要需求。本文将从贷前检测、信息泄露检测和定期检测三个方面,阐述何时进行大数据信用风险检测较为合适。 一、贷前检测 大数据信用风险检测在贷…

1.Spring入门

1.1 Spring简介 Spring是一个轻量级Java 企业级应用程序开发框架,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。 Spring Fra…

力扣701. 二叉搜索树中的插入操作

思路:往二叉搜索树中插入一个值,树的结构有多种符合的情况,那我们可以选一种最容易的插入方式,反正只需要插入一个值而已,我们不难发现,不管插入什么值,都可以安排插入到叶子节点上。 再利用二叉…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

Microsoft Visio 编辑属性值

Microsoft Visio 编辑属性值 1. 编辑属性值References 1. 编辑属性值 单击长度或高度位置,弹出形状的各属性值,点击编辑对应的属性值。 ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

解决:IDEA编译Java程序时报编译失败

1、问题展示: 2、解决方法:

自制一个操作系统 第一天

目录 环境准备引导程序 环境准备 自制操作系统的第一个困难是假设我们写好了操作系统,我们怎么模拟运行我们的操作系统?不用担心,已经有现成的模拟工具了,QEMU(Quick Emulator) 是一个广泛使用的开源计算机仿真器和虚拟机。使用它…

2023年中国抗DDoS市场规模现状及竞争格局,公有云抗DDoS是主要增长点

分布式拒绝服务(DDoS)是在DoS基础之上产生的一种新的攻击方式,具有多对一的攻击模式。它通过制造伪造的流量,使得被攻击的服务器、网络链路或是网络设备(如防火墙、路由器等)负载过高,无法处理正…

webpack5零基础入门-5使用webpack处理stylus文件

1.需要下载一个包 npm i stylus-loader 2.功能介绍 stylus-loader:负责将stylus文件编译成css文件 3.配置: const path require(path);//nodejs用来处理路径问题的模块module.exports {/**入口 */entry: ./src/main.js,/**输出 相对路径*/output: {/**文件输…

如何有效地组织和管理自己的代码?

如何有效地组织和管理自己的代码? 🧩 🛠️ 如何有效地组织和管理自己的代码? 🧩摘要引言正文1. 使用合适的目录结构2. 模块化设计3. 命名规范4. 版本控制 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页——…

008:安装Docker

安装Docker 如果不太熟悉Linux命令,不想学习Linux命令,可以直接看文末NAS面板章节,通过面板,像使用Window一样操作NAS。 一、安装 Docker 1.安装 Docker wget -qO- https://get.docker.com/ | sh2.启动 Docker 服务 sudo sys…

复习知识点

1. Java常用API 1.1 String类 在java中,String类代表字符串,字符串是常量的,不能被改变。如果想改变字符串。可以用字符串的缓冲区,StringBuffer、StringBuilder 1.1.1 String类的创建方式 第一种(常用&#xff09…

数学建模--MATLAB基本使用

1.线性方程组 这个是一个线性方程组(属于线性代数的范畴),Axb类型的方程,如果使用MATLAB进行求解,就需要分别表示A矩阵(线性方程组未知数前面的系数),b矩阵(表示等式右边…

刷题日记——非素数个数(厦大机试)

题目 分析 使用欧拉筛法计算从1到b的素数个数,方法如下: 找到一个素数后,就将它的倍数标记为合数,也就是把它的倍数“筛掉”;如果一个数没有被比它小的素数“筛掉”,那它就是素数。计算出从1到b的…

Ubuntu Desktop - gnome-calculator (计算器)

Ubuntu Desktop - gnome-calculator [计算器] 1. Ubuntu Software -> gnome-calculator -> Install -> Continue2. Search your computer -> Calculator -> Lock to LauncherReferences 1. Ubuntu Software -> gnome-calculator -> Install -> Continu…

mysql颗粒归仓

B B树:节点排序 一个节点存多个元素 多个元素也排序了 叶子节点间有指针,非叶子节点上的元素在叶子节点冗余:叶子节点存储排好序的all元素 通过数据排序提高查询速度,节点存储多个元素 高度不会太高,一个innodb页B树…

如何批量获取公众号所有文章的阅读数点赞数和留言数导出excel?

如何批量获取公众号所有文章的阅读数点赞数和留言数导出excel?我写了个脚本批量抓取,导出的excel文章数据包含文章日期,文章标题,文章链接,文章简介,文章作者,文章封面图,是否原创&a…

由浅到深认识C语言(5):函数

该文章Github地址:https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn…

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下 1. ForeverStrongCheng/OpenCV-tutorials2. Fork -> ForeverStrongCheng/R2CNN_Faster-RCNN_TensorflowReferences 访问仓库页面,点击 Fork 按钮创建自己的仓库。 Fork 是将 GitHub 的某个特定仓库复制到自己…

python二级备考(3)-综合应用

1 《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件,文件名为“命运. txt”。 问题1 (5分) :在PY301-1. py文件中修改代码,对“命运. txt”文件进行字符频次统计,输出频次最高的中文字符(不包含标点符号)及其频次&…