技术人最怕的就是只关注自己的「一亩三分地」,成为项目中的螺丝钉。
长此以往,这类工程师的技能将变得越来越狭窄,他们得到的机会和选择也将越来越少。对于有经验的工程师来说,虽然他们参与的项目越来越多,积累的却是同质化的经验;对于在校生或初级工程师来说,由于视野狭窄,他们无形中错过了很多好机会。
拓展自己的技术能力,对于求职、晋升,乃至创业来说都至关重要。而成为一位全栈工程师,将为你带来更好的发展机会。
本专栏为有志于成为全栈工程师的你量身打造,带你进行一次 Spring Boot + MyBatis + Vue + Element 全栈项目开发实战。我们选用当下主流的技术,带你从零开始实现一个完整的云笔记应用,实现前端、后端、数据库设计与开发流程。
专栏的每篇文章都有对应的完整代码在 GitHub 上托管。大家既可以参考项目的代码风格规范自己的书写习惯,也可以从中学习到合适的技术知识和设计思想,还可以基于此项目开发自己的系统和应用。
如果你是没有开发经验的在校大学生,想从事开发工作而又不知道选择哪个方向;通过本专栏的学习,可以使你真正参与到前后端分离开发的项目中去,轻松入门全栈开发,在项目的实际开发过程中选择感兴趣的技术方向,并积累足够的项目经验。
如果你是有工作经验的前端开发工程师,对后端开发感兴趣;通过本专栏的学习,可以使你对 Java 后端开发全流程有深入了解,扩展你的知识领域。
如果你是有工作经验的 Java 开发工程师,希望在技术上进一步提升;通过本专栏的学习,不仅可以使你对 Java 各种技术有重新的认知,获取到各种有助于快速开发的工具和设计结构,还可以使你对前端开发全流程有深入了解,并通过快速搭建前端项目、灵活运用各种 Vue.js 组件及 Element UI 控件来完成你想要的功能和页面布局。
本专栏分为 7 个部分,由浅入深,循序渐进,带你一步步开发出完整完善的属于自己的项目。
介绍专栏内容及专栏内的项目内容,完成项目需求分析,正式立项。
第 1 篇:导读,对本专栏要讲述的内容做简单说明
第 2 篇:需求分析,明确项目目标及产品功能树,作为后续项目开发的依据
进行项目正式开发前的所备工作:架构选择、数据库设计、接口文档设计等,以严谨的思想和正式的开发流程对待我们的项目,保证整个项目开发过程有法可依、有据可查。
第 3 篇:数据库设计,透过现象看本质,从一款产品的界面中分析出它底层的数据结构,并将其整理成文档
第 4 篇:接口文档设计,从不同的角度对功能树进行分析,将其拆分成接口,并整理成文档,作为前后端分离开发的依据
第 5 篇:前端结构设计,选择 Vue.js + Element UI 做为项目的前端架构,完成前端项目搭建,并保证功能的可用性
第 6 篇:后端结构设计,选择 Spring Boot + MyBatis 做为项目的后端架构,完成后端项目搭建,选择 Postman 做为 RestFul 接口测试工具,完成测试接口的测试工作
进行云笔记项目后端核心功能的开发,以登录注册功能为引,将项目后端的基石打牢,为后续的快速开发做准备。在这一部分的学习中,你会对 Java 深入了解,自己动手设计安全易用的服务端架构、发送邮件、开发通用工具、存取文件、压缩图像……
第 7 篇:MyBatis 通用 Mapper,利用 Java 反射机制、泛型机制完成轻量级 MyBatis 工具的开发,使后续的开发免除手写 SQL 的烦恼
第 8 篇:MyBatis 自动建表,利用 Java 自定义注解,在 通用 Mapper 的基础上完成自动建表,后续开发过程中不用再手动创建数据表
第 9 篇:统一的 HTTP 应答格式,按照接口文档要求,定义统一的应答格式,避免多人协作及前后端分离开发过程中数据格式的不统一引起的沟通成本
第 10 篇:统一的 HTTP 请求处理,通过对 HttpServletRequest 的深度解析及 RestTemplate 的灵活运用,实现 HTTP 请求的统一解析和转处理,为后端接口布置上天然屏障
第 11 篇:注册 1,在 Spring Boot 中使用 JavaMail 发送邮件验证码,完成注册接口开发
第 12 篇:注册 2,在 Vue 中,使用 Element UI 进行页面布局,并使用 axios 发送 HTTP 请求,完成注册功能
第 13 篇:登录 1,在 Spring Boot 中使用 JWT 做为用户身份认证机制,完成登录接口的开发
第 14 篇:登录 2,生成 HTTPS 证书,并在 Spring Boot、Vue 及 Postman 中进行配置,使其均支持 HTTPS,保证 JWT 在网络传输过程中的安全性;同时在 Vue 中完成登录功能
第 15 篇:用户名片1,在 Spring Boot 中实现图片的上传及压缩功能,用来保存用户头像原图和缩略图,完成用户头像上传和名片设置与读取接口
第 16 篇:用户名片 2,通过搭建 Nginx 文件服务器来为前端提供文件服务,使 Spring Boot 免受文件访问的压力;同时补充图片元数据解析与定位图片拍摄地点的知识,形成完整的图片处理知识体系
第 17 篇:用户名片 3,在 Vue 项目中,完成用户名片设置和头像上传功能
第 18 篇:修改密码,梳理用户修改密码的两种场景和三种方式,使用 JavaMail 配合 JWT 通过发送重置密码链接邮件的方式修改密码
这一部分重点讲述云笔记项目前端页面的设计,完成云笔记项目的业务功能,带你对 Vue.js 深入了解,掌握 Vue 路由配置、组件化开发、灵活运用各种开源组件。
第 19 篇:笔记本列表,在 Spring Boot 中快速实现笔记本相关接口,在 Vue 中通过组件化的思想来展示用户的笔记本列表
第 20 篇:笔记列表,在 Spring Boot 中快速实现笔记相关接口,在 Vue 中使用 vuedraggable 组件实现笔记列表的拖拽排序功能
第 21 篇:富文本笔记 1,使用 wangeditor 组件实现富文本笔记的保存和编辑功能
第 22 篇:富文本笔记 2,使用 base64 对笔记内容进行加密,以保证在传输过程中不会出现乱码
第 23 篇:MarkDown 笔记 1,使用 mavon-editor 组件实现 MarkDown 笔记的编辑和展示功能
第 24 篇:MarkDown 笔记 2,对 HTTP 传输大小和速率进行分析,通过对保存和获取笔记内容的接口进行改造来支持足够长的笔记内容
这部分介绍云笔记项目的后台管理功能,从功能设计到前后端功能实现,带你完成一个完整的后台管理系统。
第 25 篇:用户管理 1,在 Spring Boot 中快速开发出用户管理接口,使用 Element UI 搭建起经典的后台管理功能能界面,实现用户管理功能
第 26 篇:用户管理 2,使用 file-saver + xlsx 组件实现将用户数据导出到 Excel 中
第 27 篇:用户统计 1,在 Spring Boot 中添加用户注册日志和登录日志,形成用户统计的数据源,并实现新增用户数、活跃用户数等用户统计接口
第 28 篇:用户统计 2,在 Vue 中,使用 echarts 组件生成直观的日增长用户曲线图、活跃用户直方图等,将数据可视化
第 29 篇:权限管理,在 Spring Boot 和 Vue 项目中添加完整的权限控制逻辑,实现权限管理功能
这一部分介绍如何将该项目改造能支撑起千万级的用户量大型分布式项目,通过这部分的学习,让你对大数据和高并发产生亲近感:原来你就在这里。
第 30 篇:分布式部署,通过 Sping Cloud 的使用,将云笔记项目快速修改为微服务架构,实现分布式部署,从而使系统支撑起庞大的访问量
第 31 篇:缓存,在系统分布式部署的基础上使用 Redis 做为缓存,并对数据库进行分库、分表等优化设计,从而使数据库面对庞大的用户群而毫无压力
第 32 篇:异步请求,为面对庞大的用户群体,对系统内部进行优化,使用 RabbitMQ 将日志记录等非核心业务做异步请求处理,缩短单个业务的系统响应时间
对本专栏的学习内容总结与回顾,查漏补缺,深入思考,同时也是一个项目完成后对项目进行中的经验与教训的总结。
本专栏为广大开发者量身打造,带你进行一次 Spring Boot + MyBatis + Vue + Element 全栈工程师的项目开发实战,选用当下主流的技术,带你从零开始实现一个完整的云笔记应用,实现前端、后端、数据库设计与开发流程。
本专栏的每篇文章都有对应的完整代码,在 GitHub 上托管。大家可以参考项目的代码风格规范自己的书写习惯,可以从中学习到合适的技术知识和设计思想,也可以基于此项目开发自己的系统和应用。
由于我们期望将更多的干货和完整的项目开发流程带给大家,在专栏中涉及到的一些基础知识我们将不再一一赘述,因此我们来做一个约定:
在专栏中涉及到这些内容,我不会再讲一遍 JDK 如何安装、MySQL 如何配置、某个 HTML 标签是什么意思等等类似的问题。如果有不懂的,欢迎沟通,我会及时为大家解答疑惑。
本专栏精心选择了一个简单易用的云笔记项目,将专栏重点放在项目设计思想和通用的硬核代码设计上。从项目需求分析、架构选择、数据库设计、接口文档设计,到功能实现、页面效果设计前后端联调,能让你掌握完整的项目分析、设计、优化能力。
前端分别使用 Vue.js 和 Element UI 作为 核心框架和 UI 框架,使用 HBuilderX 作为开发工具;后端使用 Spring Boot + MyBatis 作为核心框架,数据库选用 MySQL,向前端提供标准的 RESTful 接口。主流的技术、大众化的开发工具,让你在使用中带有亲切感,收获满满。
本专栏中完成的项目,界面简洁大方、代码清晰优雅、注释完善简明、基础功能完备。后端代码扩展性强,可轻松升级为分布式架构和 Spring Cloud 微服务架构,从而满足各种用户量级的并发需求。
开发环境:HBuilderX,核心架构:Vue.js + Element UI,涉及到的 Vue.js 插件如下:
开发环境:IntelliJ IDEA,核心架构:Spring Boot + MyBatis,项目管理工具:Maven,主要用到的依赖包有:
本专栏分为 7 个部分,由浅入深,循序渐进,带你一步步开发出完整完善的属于自己的项目。
介绍专栏内容及专栏内的项目内容,完成项目需求分析,正式立项。
第 1 篇:导读,对本专栏要讲述的内容做简单说明
第 2 篇:需求分析,明确项目目标及产品功能树,作为后续项目开发的依据
进行项目正式开发前的所备工作:架构选择、数据库设计、接口文档设计等,以严谨的思想和正式的开发流程对待我们的项目,保证整个项目开发过程有法可依、有据可查。
第 3 篇:数据库设计,透过现象看本质,从一款产品的界面中分析出它底层的数据结构,并将其整理成文档
第 4 篇:接口文档设计,从不同的角度对功能树进行分析,将其拆分成接口,并整理成文档,作为前后端分离开发的依据
第 5 篇:前端结构设计,选择 Vue.js + Element UI 做为项目的前端架构,完成前端项目搭建,并保证功能的可用性
第 6 篇:后端结构设计,选择 Spring Boot + MyBatis 做为项目的后端架构,完成后端项目搭建,选择 Postman 做为 RestFul 接口测试工具,完成测试接口的测试工作
进行云笔记项目后端核心功能的开发,以登录注册功能为引,将项目后端的基石打牢,为后续的快速开发做准备。在这一部分的学习中,你会对 Java 深入了解,自己动手设计安全易用的服务端架构、发送邮件、开发通用工具、存取文件、压缩图像……
第 7 篇:MyBatis 通用 Mapper,利用 Java 反射机制、泛型机制完成轻量级 MyBatis 工具的开发,使后续的开发免除手写 SQL 的烦恼
第 8 篇:MyBatis 自动建表,利用 Java 自定义注解,在 通用 Mapper 的基础上完成自动建表,后续开发过程中不用再手动创建数据表
第 9 篇:统一的 HTTP 应答格式,按照接口文档要求,定义统一的应答格式,避免多人协作及前后端分离开发过程中数据格式的不统一引起的沟通成本
第 10 篇:统一的 HTTP 请求处理,通过对 HttpServletRequest 的深度解析及 RestTemplate 的灵活运用,实现 HTTP 请求的统一解析和转处理,为后端接口布置上天然屏障
第 11 篇:注册 1,在 Spring Boot 中使用 JavaMail 发送邮件验证码,完成注册接口开发
第 12 篇:注册 2,在 Vue 中,使用 Element UI 进行页面布局,并使用 axios 发送 HTTP 请求,完成注册功能
第 13 篇:登录 1,在 Spring Boot 中使用 JWT 做为用户身份认证机制,完成登录接口的开发
第 14 篇:登录 2,生成 HTTPS 证书,并在 Spring Boot、Vue 及 Postman 中进行配置,使其均支持 HTTPS,保证 JWT 在网络传输过程中的安全性;同时在 Vue 中完成登录功能
第 15 篇:用户名片1,在 Spring Boot 中实现图片的上传及压缩功能,用来保存用户头像原图和缩略图,完成用户头像上传和名片设置与读取接口
第 16 篇:用户名片 2,通过搭建 Nginx 文件服务器来为前端提供文件服务,使 Spring Boot 免受文件访问的压力;同时补充图片元数据解析与定位图片拍摄地点的知识,形成完整的图片处理知识体系
第 17 篇:用户名片 3,在 Vue 项目中,完成用户名片设置和头像上传功能
第 18 篇:修改密码,梳理用户修改密码的两种场景和三种方式,使用 JavaMail 配合 JWT 通过发送重置密码链接邮件的方式修改密码
这一部分重点讲述云笔记项目前端页面的设计,完成云笔记项目的业务功能,带你对 Vue.js 深入了解,掌握 Vue 路由配置、组件化开发、灵活运用各种开源组件。
第 19 篇:笔记本列表,在 Spring Boot 中快速实现笔记本相关接口,在 Vue 中通过组件化的思想来展示用户的笔记本列表
第 20 篇:笔记列表,在 Spring Boot 中快速实现笔记相关接口,在 Vue 中使用 vuedraggable 组件实现笔记列表的拖拽排序功能
第 21 篇:富文本笔记 1,使用 wangeditor 组件实现富文本笔记的保存和编辑功能
第 22 篇:富文本笔记 2,使用 base64 对笔记内容进行加密,以保证在传输过程中不会出现乱码
第 23 篇:MarkDown 笔记 1,使用 mavon-editor 组件实现 MarkDown 笔记的编辑和展示功能
第 24 篇:MarkDown 笔记 2,对 HTTP 传输大小和速率进行分析,通过对保存和获取笔记内容的接口进行改造来支持足够长的笔记内容
这部分介绍云笔记项目的后台管理功能,从功能设计到前后端功能实现,带你完成一个完整的后台管理系统。
第 25 篇:用户管理 1,在 Spring Boot 中快速开发出用户管理接口,使用 Element UI 搭建起经典的后台管理功能能界面,实现用户管理功能
第 26 篇:用户管理 2,使用 file-saver + xlsx 组件实现将用户数据导出到 Excel 中
第 27 篇:用户统计 1,在 Spring Boot 中添加用户注册日志和登录日志,形成用户统计的数据源,并实现新增用户数、活跃用户数等用户统计接口
第 28 篇:用户统计 2,在 Vue 中,使用 echarts 组件生成直观的日增长用户曲线图、活跃用户直方图等,将数据可视化
第 29 篇:权限管理,在 Spring Boot 和 Vue 项目中添加完整的权限控制逻辑,实现权限管理功能
这一部分介绍如何将该项目改造能支撑起千万级的用户量大型分布式项目,通过这部分的学习,让你对大数据和高并发产生亲近感:原来你就在这里。
第 30 篇:分布式部署,通过 Sping Cloud 的使用,将云笔记项目快速修改为微服务架构,实现分布式部署,从而使系统支撑起庞大的访问量
第 31 篇:缓存,在系统分布式部署的基础上使用 Redis 做为缓存,并对数据库进行分库、分表等优化设计,从而使数据库面对庞大的用户群而毫无压力
第 32 篇:异步请求,为面对庞大的用户群体,对系统内部进行优化,使用 RabbitMQ 将日志记录等非核心业务做异步请求处理,缩短单个业务的系统响应时间
对本专栏的学习内容总结与回顾,查漏补缺,深入思考,同时也是一个项目完成后对项目进行中的经验与教训的总结。
本专栏开设的目的是通过一个完整的项目开发过程来带领大家掌握前端、后端、数据库等各个模块的核心开发知识。在学习之前,重要的是选择一个合适的项目。本专栏选择了一个云笔记项目,命名为 Keller 云笔记,具体要需要什么功能呢?
无论项目大小,在动工之前,都是已经有了明确的目标,这个目标不是凭空想象的,需要经过一系列的分析与判断。百度百科上对项目需求分析做如下描述:
需求分析是指理解用户需求,就软件功能与客户达成一致,估计软件风险和评估项目代价,最终形成开发计划的一个复杂过程。
从广义上理解:需求分析包括需求的获取、分析、规格说明、变更、验证、管理的一系列需求工程。
在带着大家做云笔记项目需求分析之前,我们要掌握 4W1H 的分析原则,Who、What、Where、When、How。这个原则是在做任何项目都适用的,具体解释如下。
1. Who 用户分析
2. What 功能分析
3. Where 环境分析
4. When 项目周期
5. How 开发流程
用户
云笔记项目面向的是广大有随时随地记录习惯的用户,对用户没有技能上的要求,角色分为两种:普通用户和管理员。普通用户可以记录、管理自己的笔记;管理员可以查看系统用户数、管理用户。单机可以同时支持上百位使用者并发使用场景,分布式部署方式可以支撑千万级用户量。
开发者
该项目需要的开发者有前端开发工程师、后端开发工程师、数据库管理员和系统运维人员,项目较小,各类工程师 1 枚即可。当然,也可以由 1 枚全栈工程师独立完成。
项目功能分析是项目需求分析的重点内容,在这一步能将抽象的需求描述转换为真实可见的项目功能说明书,即项目开发过程中的重要依据。
在工作中,我们可能接到老板或者甲方这样的需求描述:
我需要一款笔记类的应用,可以编辑富文本笔记,支持 MarkDown 格式,在安卓手机、苹果手机、平板电脑上都能使用。
或者是这样的:
开发一款类似微信的聊天软件。
我最近接了个项目,描述更加简单:
参照 www.xxx.com。
这个时候我们该怎么办呢?
以第一个需求说明为例:
流程图如下:
知道分析流程后,接下来我们实际做一下云笔记项目的功能分析。
登录注册是使用应用的入口,我们来看下有道云笔记的登录页面:
我们可以看到在有道云笔记的登录页面提供了多种登录方式:账号密码登录、手机号验证码登录、QQ 账号快捷登录、微信账号快捷登录、新浪微博账号快捷登录。这些登录方式几乎是现有主流应用能用到的所有方式了,除此之外,还有一种在国外常用的登录方式:邮箱验证码登录。
我们分别对这几种登录方式进行分析,看哪些是适合我们的:
经过如上分析,云笔记项目可以使用两种登录方式:账号密码登录、邮箱验证码登录
确定好登录功能后,看注册。有道云笔记的注册功能,是在点击上图的“新用户注册”按钮后,跳转到网易邮箱账号注册页面:
观察这个页面,使用的是验证手机号的形式注册个新的邮箱账号,然后就可以用这个邮箱账号使用网易旗下的其他应用,包括有道云笔记。
和登录时我们做的分析一样,短信验证码方式对个人开发者来说不太容易实现。因此,云笔记项目使用邮箱验证码注册
登录注册功能分析完毕后,我们就可以根据选用的登录注册方式来画出界面的原型图,参考原型图如下。
登录页面:
注册页面:
有道云笔记登录后是这样的一个界面,我们来分析一下包含了多少功能。
这个界面是标准的上、左、中、右式布局。
上:
左:
中:
右:
经过以上分析后,用户功能整理如下:
参照普通应用的管理员功能,对云笔记项目的管理员功能做如下设置:
管理员功能整理如下:
使用环境
云笔记项目的使用环境是浏览器,兼容 Firefox、Chrome、Safari 浏览器,不针对 IE 浏览器做特殊设置。
运行环境
云笔记项目的运行环境可以是 Windows、macOS、Linux,可运行在个人电脑、服务器、虚拟服务器上。
项目动工日期
这里说的正式动工是指:已经对项目工作量和可行性有初步判断、开发人员初步确定、开发人员职责分配完成、可以开始项目编码工作。需要在完成前后端架构选择、数据库设计、接口文档设计后,正式动工。
项目开发周期
预计整个项目开发周期为 40 天,其中:后端 28 天,前端 12 天。
项目开发流程
项目工作量分配
在本项目中所有设计、开发和部署工作,由全栈工程师独立完成。
本篇通过参照目前市面上主流的云笔记《有道云笔记》,在其基础上进行相应的增减,来形成 Keller 云笔记项目的功能结构。本篇的功能树将指导整个项目开发过程,是后续数据库设计、接口文档设计、代码设计的基础。
需求分析完成后就确定了产品的功能结构,在此基础上进行数据库设计,将每个具体的功能数据化,为接口文档的设计和代码设计做铺垫,本篇将带领大家完成 Keler 云笔记项目的数据库设计。
数据是所有业务的基础,没有数据,业务也就没法进行下去了;数据更是业务的灵魂,所有的业务操作都是为了得到期望的数据,没有了数据,业务操作也就没有了意义。因此在编写代码前,需要先将数据设计完毕,一个好的数据库设计应该有这样的特点:数据完整、操作灵活、有可扩展性。
数据完整是对数据库设计的基本要求,要求存储数据的精确性、可靠性,要求存储的一组数据有意义。
数据有意义包含:
好的表设计,往往查询一到两个表就能得到一个业务所需要的数据。如果你设计出来的数据库在使用时发现:一个业务要查询三四张表,那么就要认真考虑一下你是不是来给程序猿们作对的。
数据完整还包括约束的完整性和用户定义的完整性,如:有适当的主键和索引、有适当的冗余字段、有适当的存储过程和清理机制等。
操作灵活是指数据间耦合度低,使用起来灵活方便,不会出现一个表又当爹又当妈的情况,具体说明我总结了如下几点:
当数据表之间的耦合度降低到合适的程度后,既能保证数据的完整性,又能避免多个业务交叉操作同一张表的场景,降低了业务逻辑的复杂度和出错的几率。
扩展性是指设计数据库时不要仅仅只是为了满足当下要求,要预见到未来可能出现的变化或者使用中可能出现的问题,一个设计经验比较足的 DBA 通常会考虑到这些:
明确好设计原则后,我们来做云笔记项目的数据库设计。数据库设计工作往往是在需求分析完毕之后开始根据功能树和业务逻辑关系来进行的,下图是在上一篇需求分析中完成的功能树:
仔细分析功能树,发现它已经将功能模块分为了用户功能、管理员功能两大类,其中:用户功能又可细分为用户信息和内容区(也就是笔记相关)两类。那么我们在设计数据库时也可以按照用户信息、笔记、管理员功能这三部分来做。
从功能树上可以看到,与用户信息相关的功能就是登录注册、用户名片相关。按照我们上面说的设计原则,可以将其分为:
具体设计如下。
create table user_info( id int auto_increment primary key, type int not null comment '用户类型', password varchar(200) null comment '密码', email varchar(200) not null comment '注册邮箱', createTime datetime null, status int null comment '用户账号状态,如账号锁定、未激活等', isDelete int null, updateTime datetime null, updateUserId int null)comment '用户信息表';create index user_info_index_email on user_info (email);create index user_info_index_status on user_info (status);create index user_info_index_type on user_info (type);
create table user_card( userId int primary key, nickName varchar(200) null, email varchar(200) null comment '展示在名片上的邮箱地址', imgUrl varchar(200) null comment '头像原图', thumUrl varChar(200) null comment '头像缩略图', createTime datetime null, updateTime datetime null, updateUserId int null)comment '用户名片表';
create table email_log( id int auto_increment primary key, type int not null comment '邮件发送类型,不能为空', email varchar(50) not null comment '收件人,不能为空', title varchar(200) not null comment '邮件标题,不能为空', content varchar(500) not null comment '邮件内容,不能为空', code varchar(50) null comment '验证码', result varchar(500) null comment '发送结果描述,如:发送失败的原因等', statusCode int not null comment '发送状态', createTime datetime not null comment '发送时间', isUsed int null comment '验证码是否已使用');create index email_log_index_email on email_log (email);create index email_log_index_type on email_log (type);
在 email_log 的设计时,要考虑到灵活性:对于验证码邮件来说,重要的是里面的验证码,因此可以为验证码单独设计一个字段保存。这样,在邮件内容里面有验证码,是拼接好的完整邮件内容,以展现给用户;code 字段单独存储一个验证码,方便系统取用。
从功能树上看到,与笔记相关的业务有:笔记本、笔记内容的增删改查,因此数据表可以分为:
具体设计如下。
create table notes_info( id int auto_increment primary key, userId int null comment '用户Id', title varchar(200) null comment '标题', subTitle varchar(200) null comment '副标题', createTime datetime null comment '创建日期', noteNumber int null comment '笔记数量', sort int null comment '排序', isDelete int null, updateTime datetime null, updateUserId int null)comment '笔记本';create index notes_info_index_userId on notes_info (userId);
create table note_info( id int auto_increment primary key, userId int null comment '用户ID', notesId int null comment '笔记本Id', title varchar(200) null comment '标题', contentMD mediumtext null comment 'MD内容', content mediumtext null comment '内容', sort int null comment '排序', createTime datetime null, isDelete int null, updateTime datetime null, updateUserId int null)comment '笔记';create index note_info_index_notesId on note_info (notesId);create index note_info_index_userId on note_info (userId);
在这两张表的设计中,有一点需要注意:不要使用外键,外键的关系在应用层实现。
这么说是因为:
另外,如果频繁使用外键、触发器、存储过程等数据库的判断逻辑,也就意味着对数据库的性能安全性需要更大的依赖,可能要专门的 DBA 维护数据库,无形中增加了小企业小项目的维护成本和复杂度。
通过功能树可以看到,在本项目中,管理员功能主要是可以查看用户统计信息,为了实现用户增长量和用户活跃度的统计,设计注册日志表和登录日志表,具体设计如下。
create table register_log( id int auto_increment primary key,userId int comment '用户ID', ip varchar(50) comment '注册IP', createTime datetime comment '注册时间' ) comment '注册日志表';
create table login_log( id int auto_increment primary key,userId int comment '用户ID', ip varchar(50) comment '登录IP', createTime datetime comment '登录时间' ) comment '登录日志表';
你会发现,两张表的数据结构一致,但是因为如下原因,将其分开存储:
另外,注册日志表也和用户基本信息表的内容有高度重合,将其分开设计的原因如下:
这种物理隔离的设计能保证在大用户量的场景中不会因为频繁查询统计数据而影响用户登录、注册的性能,也增强了数据的扩展性,为以后大型分布式系统做准备。
本篇带领大家从数据完整性、操作灵活性、可扩展性等角度考虑,完成 Keller 云笔记项目的数据库设计。数据作为所有操作的基础,合理的数据库设计可以使后续的开发过程快捷顺畅。
阅读全文: http://gitbook.cn/gitchat/column/5e7d59299bbb1d452bee7a34