糟糕的数据库设计:

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 数据库的设计相关推荐

  1. 学生机房管理服务器系统设计,广东工业大学数据库课程设计机房管理系统设计...

    <广东工业大学数据库课程设计机房管理系统设计>由会员分享,可在线阅读,更多相关<广东工业大学数据库课程设计机房管理系统设计(27页珍藏版)>请在人人文库网上搜索. 1.课程设计 ...

  2. 【数据库课程设计】金融数据库设计与实现

    数据库课程设计 文章目录 数据库课程设计 1.E-R图 2.E-R图转换为关系模式 2.1 实体集的处理 2.2 联系集的处理 2.3 整理合并 3.数据模型 3.1对象及属性对应的编号 3.2 数据 ...

  3. 个人通讯录系统——数据库课程设计

    课  程  设  计 课    程数据库原理及应用课程设计 题    目个人通讯录系统 学    院         信息工程学院                专    业        计算机科学 ...

  4. 数据库设计:用户登录系统数据库表设计

    用户登录系统数据库表设计 最近看了看公司后台用户登录系统的设计, 比较混乱, 主要还是因为URS和Oauth以及URS第三方这三个登录形式各不相同导致的. 下面着重介绍一下涉及到第三方登录中需要注意的 ...

  5. 美多商城之商品(商品数据库表设计)

    一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍      [即为商品的一个概述,一种商品的统称] SPU = Standard Pr ...

  6. Oracle数据库表设计时的注意事项

    Oracle数据库表设计时的注意事项  表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据 ...

  7. 数据库的设计经验(经典)

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  8. 数据库类型少_全栈之数据库系列 - 数据库的设计、架构和使用规范

    当我们要存储的数据比较少的时候,数据库设计的优势并不能发挥出来,但是当我们对数据的需求量越来越大时,对数据库的设计就很有必要性了!如果数据库的设计不当会造成数据冗余.修改复杂.操作数据异常等问题,而好 ...

  9. 数据库的设计(一些观点) _转

    1.数据库的设计 尽量把数据库设计的更小的占磁盘空间. 1).尽可能使用更小的整数类型.(mediumint就比int更合适). 2).尽可能的定义字段为not null,除非这个字段需要null. ...

最新文章

  1. CSDN受邀成为首批中国人工智能产业发展联盟特约媒体
  2. 中介者模式 调停者 Mediator 行为型 设计模式(二十一)
  3. 新手入门深度学习 | 卷积神经网络是什么?
  4. Chrome浏览器官方离线安装包下载
  5. mysql 嵌入式_MySql移植到嵌入式Linux平台
  6. 【数据结构与算法】之深入解析“两数相加II”的求解思路与算法示例
  7. 分辨率到底是个什么概念?它和DPI之间是什么关系?
  8. C++ 数据抽象 封装 接口
  9. java使用smtp发送邮件问题
  10. Linux关闭java命令,Linux系统关闭或重新启动主机的命令详解
  11. oracle 收集统计信息会锁表吗,统计信息锁住导致收集统计信息失败引起sql执行异常...
  12. 关于JEECG中表单提交的中断与手动提交
  13. LDA︱基于LDA的Topic Model变形+一些NLP开源项目
  14. 21岁开始练字晚不晚?
  15. app 要求字体使用楷体,使用字体包
  16. CHM格式的帮助文档制作与代码调用 Visual Studio C#
  17. 求求你用数学炒股行不行?
  18. SAP发票校验容差的理解
  19. Camera ITS测试
  20. npf拒绝访问的问题

热门文章

  1. 2016在电影院看过的电影
  2. LabVIEW编程LabVIEW开发控制PACE1000精密压力测试仪例程与相关资料
  3. qemu-img命令
  4. idea选中多行的一列、一竖(不是多行的全部内容)
  5. Java的foreach中,变量加final的作用(for(final XXX xxx : xxxs))
  6. java entries_Enumerationlt;? extends ZipEntrygt; entries()_学习Java Zip|WIKI教程
  7. 网络基础知识:10M、50M、100M宽带下载速率一般是多少?
  8. 万字长文告诉你喜茶为什么能成功
  9. 免费在线证件照制作-超级好用
  10. luckysheet实现在线编辑Excel