mapengpeng1999@163.com 数据库的设计
糟糕的数据库设计:
1.数据冗余、浪费空间
2.数据插入删除很麻烦
3.程序性能差
良好的数据库设计:
1.节省内存空间(不存在多个表中出现重复字段)
2.保证数据库完整性
3.方便我们开发系统
软件开发中,关于数据库的设计
1.分析需求:分析业务和需要处理的数据库的需求
2.概要设计:设计关系图(E-R图)
设计数据库的步骤:(个人博客)
1.收集信息、分析需求
用户表(用户登入注销,用户的个人信息,写博客,创建分类(多个人))
分类表(文章分类,谁创建的)
文章表(文章的信息)
评论表:
友情链接(发链接信息)
说说表:(发表心情,id,content,create_time)
自定义表(系统信息,某个关键的字,或者一些主字段) key: value
数据库命名用下划线区分不用大驼峰,因为数据库不区分大小写。
用户表(user):id,username,password,sex,age,sign(个人签名)
分类表(category):id(分类id),category_name(分类标题),create_user_id(创建用户的id)
文章表(blog):id(文章id),title(文章标题),author_id(写文章的用户),category_id(文章分类),content(文章内容),create_time(创建时间),update_time(修改时间),love(喜欢点赞)
评论表:id(评论id),blog_id(所属文章),user_id(评论人),content(评论内容),create_time(评论时间),user_id_parent(回复人的id)
友情链接表:id(友情链接id),links(网站名称),href(网站链接),sort(排序,int型)
标识表之间的关系:
写博客:user-blog
创建分类:user-category
关注:user-user
友情链接:links
评论表:user-user-blog
数据库三大范式
第一范式:
原子性:保证每一列不可再分。
第二范式:
前提是满足第一范式,每张表只描述一件事。
第三范式:
前提是满足第一范式和第二范式,第三范式需要保证数据表中的每一列数据都和主键直接相关,而不能间接相关。
规范和性能问题
关联查询的表不得超过三张表
1.考虑商业化的需求和目标,(成本 用户体验)数据库的性能更加重要。
2.在规范性能的问题的时候,需要适当的考虑一下规范性。
3.故意给某些表增加一些冗余的字段(从多表查询中变为单表查询)
4.故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
事务
要么都成功,要么都失败。
ACID原则
原子性:要么全部完成,要么都不完成。
一致性:总数不变
隔离性:多个进程互不干扰
持久性:一旦提交不可逆,持久化到数据库了
隔离性的问题:
脏读:一个事务读取了另一个没有提交的事务
不可重复度:在同一个事务内,重复读取表中的数据,表数据发生了改变
虚读(幻读):在一个事务内,读取到了别人插入的数据,导致前后读出来的结果不一致。
JAVA代码实现:
1.开启事务 conn.setAutoCommit(false);
2.一组业务sql执行完毕,提交事务
3.可以在catch语句中显示的定义回滚语句,出现异常就回滚
数据库连接池
数据库连接,执行完毕,释放。频繁的连接释放很浪费系统资源。
池化技术:准备好一些预先的资源,过来就连接预先准备好的
假如常用连接数10个,最小连接数就设为10个(根据常用连接数来设置的),
最大连接数:15个(业务最高承载上限)超过了就排队等待,例如等待超时:100ms
编写连接池,实现一个接口DataSource
开源数据源实现
DBCP
C3P0
Druid:阿里巴巴
使用了这些数据库连接池之后,在项目开发中就不需要编写连接数据库的代码了。
DBCP:需要用到的jar包,commons-dbcp-1.4,commons-pool-1.6
C3P0: 需要用到的jar包,c3p0-0.9.5.5,mchange-commons-java-0.2.19
总结:无论使用什么数据源,本质还是一样的,DataSource接口不会变,方法就不会变。
数据库中的数据类型,int后的()可省略,大小会自动在1到12之间判断,
char()长度固定的字符数浪费空间,varchar()长度不固定的字符数很灵活建议使用
date YYYY-MM-DD,日期格式
time HH:mm:ss,时间格式
datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
日期时间类型后面不加(),内容为字符串加单引号。null,空的没有值
注意:不要使用NULL进行运算,结果为NULL
关于数据库引擎
INNODB:默认使用
MYISAM:早些年使用的
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持(表锁) | 支持(行锁,效率高) |
外键约束 | 不支持 | 支持 |
全文索引(搜索到文章内容) | 支持 | 不支持 |
表空间大小(内存) | 较小 | 较大,约为MYISAM的2倍 |
常规的使用操作:
MYISAM:节约空间,速度较快
INNODB:安全性高,支持事物的处理,支持外键就支持多表多用户操作。
在物理空间存放的位置:
所有的数据库文件都存放在data目录下,一个文件夹就是一个数据库,本质是文件的存储。
在隐藏目录(C:\ProgramData)C:\ProgramData\MySQL\MySQL Server 5.5\data下
MYSQL引擎在物理文件上的区别:
INNODB:在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
MYISAM对应文件:*.frm 表结构的定义文件 *.MYD 数据文件(data)*.MYI 索引文件(index)
设置数据库的字符集编码
CHARSET=utf8
不设置的话,会是mysql默认的字符集编码(不支持中文)
MYSQL的默认编码是Latin1,不支持中文
在my.ini中配置默认的编码
character-set-server=utf8
不建议这样操作,把物理文件改了,只能在我电脑不乱码,在别人电脑一样乱码
所有的创建和删除操作尽量加上判断
drop table if exists teacher;
create table if not exists teacher;外键(物理外键,数据库级别的外键,不建议使用,避免数据库过多造成困扰)
1.表与表之间有联系删除很麻烦。2.表多外键多就很乱。
constraint给外键起个别名,references引用
1.创建表时添加外键,不能两个表同时在创建时添加外键,
因为另外一个表还没有创建这个表就无法关联上另外那个表的字段。
2.创建后添加外键:(建表的时候最好不加约束,需要的时候再添加)
alter table student
add constraint FK_gradeid foreign key(gradeid) references grade(gradeid);
删除有外键关系的表时,必须先删除引用别人的表(从表),再删除被引用的表(主表)
alter table 给哪个表加外键 add constraint 给外键约束起个别名 foreign key(作为外键的列) references 引用哪个表(引用哪个表中的哪个字段)总结:
1.数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
2.如果想使用多张表的数据,想使用外键(用程序去实现)
不能使用外键与级联,一切外键概念必须用JAVA代码解决。
原因:每次做DELETE和UPDATE都必须考虑外键约束会很麻烦。
数据库的意义:数据存储,数据管理。
DML语言:数据操作语言,insert,update,delete
insert into 表名(字段1,字段2,字段3...) values (值1,值2,值3...);
可以只插入某些指定字段:
insert into grade(gradename) values ('大四');
主键自增就可以省略添加的主键字段。
如果不写添加表的字段,默认给表中所有的字段添加值。
写插入语句,一定要数据和字段一一对应。
插入多个字段:一定要数据和字段一一对应。
insert into student(name,age,sex) values ('大四',21,'女'),
('大三',20,'女'),('大二',18,'男'); update修改
update student set name = '马鹏鹏' where id = 1; 带有修改条件
update student set name = '马鹏鹏'; 会改动所有的表
update student set name = '马鹏鹏',email='mpp_123@163.com' where id = 1; 修改多个属性用逗号隔开
MYSQL中不等于号有<>和!=两种,BETWEEN AND为闭区间。delete删除
delete from student;删除全部表数据,避免这样写
delete from student where id = 1;删除指定数据
truncate清空
作用:完全清空一个数据库表,表结构和索引约束不会变(表结构和索引delete清空也不会变)
清空表: truncate student;
delete删除和truncate清空区别:
相同点:都能删除数据,都不会删除表结构。
不同点:
truncate清空,会重新设置自增列,计数器会归零。不会影响事务。
delete删除的问题,就是在重启数据库会发现这么一个现象:
如果引擎是INNODB,自增列会从1开始(存储在内存中,断电即失,没有持久化)
如果引擎是MYISAM,自增列继续从上一个自增量开始(存储在文件中的,不会丢失)
DQL数据查询语言:
分析需求,分析查询的字段来自哪些表(2张表就要连接查询)
确定使用哪种连接查询?
自连接:自己和自己连接
索引:
索引:帮助MYSQL高效快速获取数据的数据结构。
索引在小数据量的时候,用途不大,但是在大数据量的时候,区别十分明显。
在一个表中,主键索引只能有一个,唯一索引可以有多个。索引的分类:
主键索引(PRIMARY KEY):唯一标识,主键不可重复,只能有一个列作为主键
唯一索引(UNIQUE KEY):避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
常规索引(KEY/INDEX):默认的,可以用index或key关键字来设置
全文索引(fullText):在特定的数据库引擎下才有,MyISAM。快速定位数据
索引原则:
1.索引不是越多越好
2.不要对进程变动数据加索引
3.小数据量的表不需要加索引
4.索引一般加在常用来查询的字段上
索引的数据结构:
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
MYSQL备份:
为什么要备份:
保证重要的数据不丢失
数据转移
MYSQL数据库备份的方式:
1.直接拷贝物理文件
在隐藏目录(C:\ProgramData)C:\ProgramData\MySQL\MySQL Server 5.5\data下
2.在Sqlyog这种可视化工具中手动导出
在想要导出的表或者库中,右击,选择备份或导出。
3.使用命令行导出 mysqldump 命令行的使用
mapengpeng1999@163.com 数据库的设计相关推荐
- 学生机房管理服务器系统设计,广东工业大学数据库课程设计机房管理系统设计...
<广东工业大学数据库课程设计机房管理系统设计>由会员分享,可在线阅读,更多相关<广东工业大学数据库课程设计机房管理系统设计(27页珍藏版)>请在人人文库网上搜索. 1.课程设计 ...
- 【数据库课程设计】金融数据库设计与实现
数据库课程设计 文章目录 数据库课程设计 1.E-R图 2.E-R图转换为关系模式 2.1 实体集的处理 2.2 联系集的处理 2.3 整理合并 3.数据模型 3.1对象及属性对应的编号 3.2 数据 ...
- 个人通讯录系统——数据库课程设计
课 程 设 计 课 程数据库原理及应用课程设计 题 目个人通讯录系统 学 院 信息工程学院 专 业 计算机科学 ...
- 数据库设计:用户登录系统数据库表设计
用户登录系统数据库表设计 最近看了看公司后台用户登录系统的设计, 比较混乱, 主要还是因为URS和Oauth以及URS第三方这三个登录形式各不相同导致的. 下面着重介绍一下涉及到第三方登录中需要注意的 ...
- 美多商城之商品(商品数据库表设计)
一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 [即为商品的一个概述,一种商品的统称] SPU = Standard Pr ...
- Oracle数据库表设计时的注意事项
Oracle数据库表设计时的注意事项 表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据 ...
- 数据库的设计经验(经典)
1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...
- 数据库类型少_全栈之数据库系列 - 数据库的设计、架构和使用规范
当我们要存储的数据比较少的时候,数据库设计的优势并不能发挥出来,但是当我们对数据的需求量越来越大时,对数据库的设计就很有必要性了!如果数据库的设计不当会造成数据冗余.修改复杂.操作数据异常等问题,而好 ...
- 数据库的设计(一些观点) _转
1.数据库的设计 尽量把数据库设计的更小的占磁盘空间. 1).尽可能使用更小的整数类型.(mediumint就比int更合适). 2).尽可能的定义字段为not null,除非这个字段需要null. ...
最新文章
- CSDN受邀成为首批中国人工智能产业发展联盟特约媒体
- 中介者模式 调停者 Mediator 行为型 设计模式(二十一)
- 新手入门深度学习 | 卷积神经网络是什么?
- Chrome浏览器官方离线安装包下载
- mysql 嵌入式_MySql移植到嵌入式Linux平台
- 【数据结构与算法】之深入解析“两数相加II”的求解思路与算法示例
- 分辨率到底是个什么概念?它和DPI之间是什么关系?
- C++ 数据抽象 封装 接口
- java使用smtp发送邮件问题
- Linux关闭java命令,Linux系统关闭或重新启动主机的命令详解
- oracle 收集统计信息会锁表吗,统计信息锁住导致收集统计信息失败引起sql执行异常...
- 关于JEECG中表单提交的中断与手动提交
- LDA︱基于LDA的Topic Model变形+一些NLP开源项目
- 21岁开始练字晚不晚?
- app 要求字体使用楷体,使用字体包
- CHM格式的帮助文档制作与代码调用 Visual Studio C#
- 求求你用数学炒股行不行?
- SAP发票校验容差的理解
- Camera ITS测试
- npf拒绝访问的问题
热门文章
- 2016在电影院看过的电影
- LabVIEW编程LabVIEW开发控制PACE1000精密压力测试仪例程与相关资料
- qemu-img命令
- idea选中多行的一列、一竖(不是多行的全部内容)
- Java的foreach中,变量加final的作用(for(final XXX xxx : xxxs))
- java entries_Enumerationlt;? extends ZipEntrygt; entries()_学习Java Zip|WIKI教程
- 网络基础知识:10M、50M、100M宽带下载速率一般是多少?
- 万字长文告诉你喜茶为什么能成功
- 免费在线证件照制作-超级好用
- luckysheet实现在线编辑Excel