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

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

采用:第三范式(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://xiahunao.cn/news/2869154.html

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

相关文章

【分布式websocket 】前端vuex管理客户端消息crud!使用localStorage来存储【第19期】

前言 聊天系统客户端是要存储消息的,因为所有所有的历史消息都从服务器拉的话一方面服务器压力大,另一方面也耗费用户流量。所以客户端存储消息是势在必行的。如何存储呢上一篇文章也写了,大概就是浏览器的话是localStorage或者IndexedDB。然…

Docker 学习笔记一

一、什么是docker Docker 是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发;Docker是一个C/S架构,后端众多模块各司其职,docker的daemon是运行在主机上通过client可以进行通信。 docker 由三部分组成:镜像(…

【第六章】简单网络实现手写数字分类-编程实现

前言 让我们编写一个程序,学习如何使用随机梯度下降和MNIST训练数据来识别手写数字。我们将通过一个简短的Python程序来实现这一点,只需要74行代码!首先我们需要获取MNIST数据。 本章代码和数据下载地址: https://download.csdn.…

碳素光线疗法与中医

看得见的穴位碳素光线疗法 最近日本的医疗随着科学技术的发达,在基础研究、临床各领域取得了显著的发展。日本人的平均寿命比战前大幅延长,结核及其他疑难杂症、癌症等疾病也在逐渐被压制。其中,作为癌症的辅助疗法,日本癌症学会等…

【PyTorch】成功解决ModuleNotFoundError: No module named ‘torch’

【PyTorch】成功解决ModuleNotFoundError: No module named ‘torch’ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希…

蓝桥杯单片机快速开发笔记——独立键盘

一、原理分析 二、思维导图 三、示例框架 #include "reg52.h" sbit S7 P3^0; sbit S6 P3^1; sbit S5 P3^2; sbit S4 P3^3; void ScanKeys(){if(S7 0){Delay(500);if(S7 0){while(S7 0);}}if(S6 0){Delay(500);if(S6 0){while(S6 0)…

Flink 集群部署模式

文章目录 前言一、会话模式(Session Mode)二、单作业模式(Per-Job Mode)三、应用模式(Application Mode) 前言 Flink支持多种集群部署模式,以满足不同场景和需求。以下是Flink的主要集群部署模…

Rust学习02:推荐一本入门书,免费的

都说Rust的学习曲线很陡峭,试过才知雀实不容易。 先说我的基础,非科班,自学Python,写过几个小程序。 我买书从来不扣扣嗖嗖的,所以先啃了几本Rust的入门书,包括: Tim McNamara的《Rust实战》&am…

javaEE——线程的等待和结束

文章目录 Thread 类及常见方法启动一个线程中断一个线程变量型中断调用 interrupt() 方法来通知观察标志位是否被清除 等待一个线程获取当前线程引用休眠当前线程 线程的状态观察线程的所有状态观察 1: 关注 NEW 、 RUNNABLE 、 TERMINATED 状态的切换 多线程带来的风险为什么会…

基于SpringBoot框架实现的B2B平台的医疗病历交互系统

采用技术 基于SpringBoot框架实现的B2B平台的医疗病历交互系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员角色 医院管理 医院注册 医院文…

pytorch 入门基础知识一(Pytorch 01)

一 深度学习基础相关 深度学习三个主要的方向:计算机视觉,自然语言,语音识别。 机器学习核心组件:1 数据集(data),2 前向传播的model(net),3 目标函数(loss), 4 调整模型参数和优化函数的算法…

C#混淆心得

C#混淆心得 近期遇到混淆C#代码的需求,在网上找了很多办法,在此记录一下。 混淆的本质就是让代码变丑,让别人看不懂。 为什么要混淆: 1.保护核心代码 可以在一定程度上避免别人偷代码,从而保护重要的部分&#xf…

vscode jupyter 如何关闭声音

网上之前搜的zen模式失败 仅仅降低sound失败 #以下是成功方式: 首先确保user和remote的声音都是0: 然后把user和remote的以下设置都设置为off就行了! 具体操作参考 https://stackoverflow.com/questions/54173462/how-to-turn-off-or-on-so…

传输层/UDP/TCP协议

再谈端口号 TCP/IP协议用“源IP”,“源端口号”,“目的IP”,“目的端口号”,“协议号”,这样一个五元组来标识一个通信(可以用netstat -n来查看)。 端口号的划分和知名端口号 我们之前就说过&am…

综合知识篇05-设计模式考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

【Java】容器|Set、List、Map及常用API

目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合: 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…

如何监控用户对网站的操作行为?

需求: 1、对所有用户的操作进行监控,包括用户行为的录制 2、通过用户操作热度地图,来监控每个功能的使用频率,从而来决策产品的下一步迭代 一、浏览器自带的录频方法 MediaDevices.getUserMedia() 二、html2canvas页面截屏方法 …

2022年安徽省职业院校技能大赛 (高职组)“云计算”赛项样卷

#需要资源或有问题的,可私博主!!! #需要资源或有问题的,可私博主!!! #需要资源或有问题的,可私博主!!! 第一场次:私有云(5…

cool 中的Midway ----node.js的TypeORM的使用

1.介绍 TypeORM | Midway TypeORM 是 node.js 现有社区最成熟的对象关系映射器(ORM )。本文介绍如何在 Midway 中使用 TypeORM 相关信息: 描述可用于标准项目✅可用于 Serverless✅可用于一体化✅包含独立主框架❌包含独立日志❌ 和老写…

展开说说:Android之SharedPreferences

SharedPreferences 是一种轻量级的数据持久化存储机制。以key/value键值对形式存储在xml文件,用于保存一些应用程序数据。保存在 /data/data/PACKAGE_NAME/shared_prefs/xxx.Xml文件。 SharedPreferences 只能存储string,int,float&#xff…