mysql优化-数据库设计基本原则

一、数据库设计三范式

第一范式:字段具有原子性
原子性是指数据库的所有字段都不可被再次划分,如下表就不满足原子性,起点与终点 字段就可被拆分为起点与终点两个字段。

id 起点-终点
1 北京-上海
2 北京-广州

第二范式:消除对主键的部分依赖
依赖是指在数据库表中,通过字段A就可以确定字段B,这就叫B对A依赖。
而部分依赖就是指当数据库表中主键为复合主键(A,C),而B仅仅对A依赖,这种情况称作部分依赖。
正确的方法是创建一个与业务逻辑无关的 id 主键,其他字段就对主键只存在唯一依赖,即满足第二范式的要求。

第三范式:消除对主键的传递依赖
传递依赖: 若B字段依赖A字段,C字段依赖B字段,则C字段对A字段构成传递依赖。

id 列车号 座次 起点 终点
1 D705 11车04号 北京 上海
2 K507 15车77号 北京 重庆

如上图所示列车的起点和终点都对主键id产生部分依赖(起点,终点-->列车号-->id)
解决方法:分表,将传递依赖部分单独建表.

列车号 起点 终点
D705 北京 上海
K507 北京 重庆
(列子不恰当别在意)

此处应注意的是三范式中,满足第二范式的一定要满足第一范式,满足第三范式的一定要满足第一和第二范式。


二、数据库字段设计原则

1.尽量使用整数来表示字符串
使用整型数表示字符串有两大优势:
-->1.整型数所占存储空间一般小于字符串
-->2.整型数的运算速度快

2.使用定点数表示浮点数
浮点数在计算机中保存和运算易失真,对于银行金额一类精度要求高的数据,我们可以选用定点数decimal存储,定义decimal(P, D)可以创建一个整数位最多P位,小数位最多D位的定点数.

3.使用尽量小的数据类型

4.尽量避免使用非空字段

1. null字段无法参与除null与is not null以外的运算
2. null的存储需要额外的空间

5.字段注释完整,字段名具有逻辑含义

6.单表字段不宜过多

7.使用预留字段

三、应用关联表

mysql两表之间可以存在三种特殊关系一对多,多对多,一对一,对应3对同名关联表。
1. 一对多关联表 --------通常关联外键设置在多的一方
2. 多对多关联表 --------通过创建第中间表,存储两张表主键之间的对应关系.中间表与两张实体表分别形成两个一对多的关系.
3.一对一关联表 --------一对一关联关系,可以直接用一张表来存储.但是如果表中的字段数过多或部分字段不常用,可以考虑分表,两张表共享同一主键.

mysql优化-数据库设计基本原则的更多相关文章

  1. (1.13)mysql优化数据库对象

    (1.13)mysql优化数据库对象 1.mysql优化数据库对象 [1.1]数据库对象类型优化 select * from test1 procedure analyse(); ,); --不要为那 ...

  2. mysql优化-数据库优化、SQL优化

    我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) ...

  3. MySQL学习-数据库设计以及sql的进阶语句

    1.数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power des ...

  4. Mysql优化-字段设计

    摘抄并用于自查笔记 1. 对精度有要求decimal float 类型用于表示单精度浮点数值,而double类型用于表示双精度浮点数值,float 和 double 都是浮点型,而 decimal 是 ...

  5. 19.Mysql优化数据库对象

    19.优化数据库对象19.1 优化表的数据类型应用设计时需要考虑字段的类型和长度,并留有一定长度冗余.procedure analyse()函数可以对表中列的数据类型提出优化建议.procedure ...

  6. Mysql之数据库设计

    一.三大范式 1.第一范式:消除一个字段包含多个数据库值,消除一个记录包含重复的组(单独的一列包含多个项目),即可满足1NF. 2.第二范式:消除部分依赖性即可转化为2NF.部分依赖性表示一个记录中包 ...

  7. MySQL 优化、设计规则浅谈

    当数据量大,数据库相应慢时都会针对数据库进行优化.这时都是要针对具体情况,具体业务需求进行优化的. 但是有些步骤和规则应该适合各种情况的.这里综合网上找的资料简单分析一下. 第一优化你的sql和索引: ...

  8. python——mysql京东数据库设计案例(源码)

    # 显示界面信息# 循环界面信息# 根据用户输入数据来做相应的选择from pymysql import connect def jingdong_info(): '''#显示界面信息''' prin ...

  9. MySQL 优化数据库对象

    一.考虑是用 procedure analyse() 函数对当前应用的表进行分析.字段类型是否可优化. 二.通过拆分提高表的访问效率. (A) 针对MyISAM表,有两种拆分方法: 垂直拆分:主码和某 ...

随机推荐

  1. C++构造与析构函数中调用虚函数的问题

    前些天想把以前写的内存池算法重写一遍,跨平台是第一目标,当时突发奇想,因为不愿意做成一大堆#if..#end,所以想利用C++的多态性,但是怎么让内存池完好退出却没想到自认为完美的方案.但是一个很偶然 ...

  2. 并发和多线程(二)--启动和中断线程(Interrupt)的正确姿势

    启动线程: 从一个最基本的面试题开始,启动线程到底是start()还是run()? Runnable runnable = () -> System.out.println(Thread.cur ...

  3. Appium环境安装步骤 + 代码验证环境是否成功

    1.安装Microsoft .NET Framework 4.5 检测本机已安装的程序中,是否已经安装Microsoft .NET Framework 4.5及以上的版本. 如下图所示:   如果没有 ...

  4. <数据库>MySQL补充( 查询)

    show create table 表名 \G;(查看创建的属性) alter table 表名 auto_increment=xx;(修改自增起始值) set session auto_increm ...

  5. eclipse下项目复制改名注意事项

    当在Eclipse下复制Web工程时 1.需要修改复制后新工程源码文件下 .settings 文件夹下的org.eclipse.wst.common.component中的内容为本工程名,明细如图:

  6. 语义分割--全卷积网络FCN详解

    语义分割--全卷积网络FCN详解   1.FCN概述 CNN做图像分类甚至做目标检测的效果已经被证明并广泛应用,图像语义分割本质上也可以认为是稠密的目标识别(需要预测每个像素点的类别). 传统的基于C ...

  7. 最小费用最大流——ZKW

    对于最小费用最大流,我们的通常做法是EK+SPFA. 然而,卡常界大佬ZKW发明了一个求解最小费用最大流的方法,很强啊. 在学ZKW费用流前,先说说KM算法. KM算法 为啥要先提这个呢?因为ZKW费 ...

  8. Python-流程控制 if判断

    目录 if 判断 语法 单分支结构 双分支结构 多分支结构 for循环 语法 for + break for + continue for + else range函数 for + if 练习 if ...

  9. Result结果类型详解

    配置Result 在 struts.xml 文件中,<result> 元素用于配置 Result 逻辑视图与物理视图之间的映射关系,它有两个可选属性 name 和 type.其中,name ...

  10. Django模型中的OneToOneField和ForeignKey有什么区别?

    说是ForeignKey是one-to-many的,并举了一个车的例子: 有两个配件表,一个是车轮表,另一个是引擎表.两个表都有一个car字段,表示该配件对应的车. 对于车轮来说,多个对应一个car的 ...