数据库设计

需求分析

*1.用户模块

用于记录记录注册用户信息

包括属性:用户名,密码,电话,邮箱,身份证号,地址,姓名,昵称...

可选唯一标志属性:用户名,电话,身份证号

存储特点:随系统上线时间逐渐增加,需要永久存储

*2.商品模块

用于记录记录注册用户信息

包括属性:商品编码,商品名称,商品品类,重量,价格...

可选唯一标志属性:商品编码,商品名称

存储特点:对下线商品可归档

*3.订单模块

用于记录记录注册用户信息

包括属性:订单号,用户姓名,用户电话,收货地址,商品编号,数量,价格,订单状态,支付状态,订单类型...

可选唯一标志属性:订单号

存储特点:永久存储(分表,分库存储)

逻辑设计

*1.第一范式

数据库表中的所有字段都是单一属性,不可再分

例如:

StudyNo | Name | Sex | Contact

20040901 john Male Email:kkkk@ee.NET,phone:222456

20040901 mary famale email:kkk@fff.net phone:123455

以上的表就不符合,第一范式:主键StudyNo重复(实际中数据库不允许重复的),而且Contact字段可以再分

所以变更为正确的是

StudyNo | Name | Sex | Email | Phone

20040901 john Male kkkk@ee.net 222456

20040902 mary famale kkk@fff.net 123455

*2.第二范式

不存在非关键字段对于候选关键字段的部分函数依赖;例如:表中的关键字段(商品名称)决定了非关键字段(价格、描述、重量、有效期、饮料);关键字段(供应商名称)决定了非关键字段(供应商电话),所以关键字段和非关键字段之间存在着部分函数依赖;通俗的来说:就是第二范式要求表的主键和非主键之间“不能”有一毛钱的关系,这样才不会产生部分函数依赖;而属于完全函数依赖;这样就可以定义成:表中的非关键字段要和关键字段存在着完全函数依赖

StudyNo | Name | Sex | Email | Phone | ClassNo | ClassAddress

01 john Male kkkk@ee.net 222456 200401 A楼2

01 mary famale kkk@fff.net 123455 200402 A楼3

这个表完全满足于第一范式,

主键由StudyNo和ClassNo组成,这样才能定位到指定行

但是,学生和班级是多对多关系,所以StudyNo和ClassNo才能标志出一个学生,ClassAddress部分依赖于关键字(ClassNo-〉ClassAddress),

存在问题 :

插入异常:如果没有200401这个课号,则找不到这个课号信息

删除异常:本例删除一个200401的学生信息,则也找不到这个课号信息

更新异常: 如果要更新200401课号地址(只更新一个学生的),势必要更新所有200401课号学生的

数据冗余:提供多个学生,会有许多课号地址冗余

所以要变为两个表

表一

StudyNo | Name | Sex | Email | Phone | ClassNo

  01            john         Male       kkkk@ee.net  222456   200401     

  01           mary         famale    kkk@fff.net    123455      200402

表二

ClassNo | ClassAddress

200401 A楼2

200402 A楼3

*3.第三范式

StudyNo | Name | Sex | Email | bounsLevel | bouns

20040901 john Male kkkk@ee.net 优秀 $1000

20040902 mary famale kkk@fff.net 良 $600

这个完全满足了第二范式,但是bounsLevel和bouns存在传递依赖

更改为:

StudyNo | Name | Sex | Email | bouunsNo

20040901 john Male kkkk@ee.net 1

20040902 mary famale kkk@fff.net 2

bounsNo | bounsLevel | bouns

1 优秀 $1000

2 良 $600

*4.BC范式

假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

(仓库ID, 存储物品ID) →(管理员ID, 数量)

(管理员ID, 存储物品ID) → (仓库ID, 数量)

所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

(仓库ID) → (管理员ID)

(管理员ID) → (仓库ID)

把仓库管理关系表分解为二个关系表:

仓库管理:StorehouseManage(仓库ID, 管理员ID);

仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

逻辑设计

反范式

本质上就是用空间来换取时间,把数据冗余在多个表中,当查询时可以减少或者是避免表之间的关联

mysql 数据库设计的更多相关文章

  1. mySql 数据库设计原则

    mysql数据库设计原则: 必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 禁止使用存储过程.视图.触发器.Event 解读:高并发大数据 ...

  2. mysql数据库设计规则总结

    MySQL数据库设计总结   规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的 ...

  3. MySQL 数据库设计的“奥秘”

    2 MySQL 数据库设计的"奥秘" [主题]逻辑设计:数据类型与 Schema 所谓"万丈高楼平地起",一个稳固的建筑离不开扎实的基础.同样,良好的的「逻辑设 ...

  4. mysql数据库设计

    2.MySQL之选择字段数据类型 1.http://blog.itpub.net/29660208/viewspace-1208352/ 3.http://www.cnblogs.com/HondaH ...

  5. MySQL数据库设计复习笔记及项目实战

    最近手头上有3个项目开动,其他2个都是从底层开始的,一个已经开始了一段时间的了,在小城市小团队开发的条件下,都没有专门的DBA来做数据库的设计和维护,往往都是开发人员顶上,可是看了很多的数据库的设计, ...

  6. 互联网产品mysql数据库设计总结

    mysql数据库性能不比oracle数据库,所以设计上,和oracle有一些不同.下面总结一些互联网产品的数据库设计. 1.主键 主键可以使用bigint(20) unsigned也可以使用varch ...

  7. 范式及其在mysql数据库设计中的应用

    一.什么是范式 1.1.范式:Normal Format,是离散数学的知识,是为了解决数据的存储与优化而提出来的.要求存储数据后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数 ...

  8. MYSQL数据库设计之字段选择原则

    关于字段的选择其实很多地方都有进行详细的介绍,我这里只写一下我在使用过程中的心得感受.如果想要全面的了解的话,大家可以去看高性能MYSQL这一本书籍,里面有一章节介绍的特别全面,基本涉及MYSQL中全 ...

  9. mysql 数据库设计(转)

    本规范适用于mysql 5.1或以上版本使用 数据库范式 第一范式(1NF)确保每列保持原子性 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项. ...

  10. MySQL数据库设计常犯的错以及对性能的影响

    1.过分的反范式化为表建立太多的列 我们在设计数据库的结构时,比较容易犯的第一个错误就是对表进行了过分的反范式化的设计,这就容易造成了表中的列过多,虽然说Mysql允许为一个表建立很多的列,但是由于M ...

随机推荐

  1. 打印 laravel 模型查询产品的 SQL

    1.在路由閉包打印sql 打印一段代码生产的 sql 语句,使用路由闭包做个实验 Route::get('/get-sql', function() { DB::enableQueryLog(); $ ...

  2. WPF项目中解决ConfigurationManager不能用(转)

    https://blog.csdn.net/MOESECSDN/article/details/78107888 在WPF项目中遇到这样的问题,做一下笔记.希望对自己和读者都有帮助. 在aap.con ...

  3. MySql开启远程账户登陆总结

    1.更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"127.0.0.1"改成"% ...

  4. FPGA中iic总线上,应答ACK解析

    首先要明白一点,有效ACK是指第9位为低电平,第十位,十一位就管不着了,(我写的代码发现第九位为低电平,之后复位为高电平,开始没注意后来搞的很是头痛) 主机发ack和主机检测ack,主机发ack是在从 ...

  5. Lock和synchronized的区别和使用

    Java并发编程:Lock 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问 ...

  6. Windows10关闭自动更新

    1 使用windows+r调出运行,输入:services.msc2 找到Windows update,右键选择属性:将启动类型从自动改为手动.3 使用windows+r调出运行,输入:gpedit. ...

  7. iOS上传本地代码到git

    1.顾名思义,首先你得注册一个github账户 这个我就不细说了. 2.然后你得创建一个 repository  步骤见下图 3.相当于创建成功 会跳到下图界面 4.一看就很清楚了 create a ...

  8. Hive环境的安装

    hive是什么:hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能(HQL) hive有什么用 1.通过类SQL语句快速实现简单的Map ...

  9. 把已经安装到C盘的软件完美移动到D盘

    背景信息 今天早上在安装软件的时候发现C盘爆满,只剩下最后10G了.而我要安装的玩意儿必须装到C盘. 靠清理垃圾文件来解决并不是一个好方法,实际上通常垃圾文件占用很少,而且就算清理了,也还会再出现. ...

  10. 自然语言处理(NLP)入门学习资源清单

    Melanie Tosik目前就职于旅游搜索公司WayBlazer,她的工作内容是通过自然语言请求来生产个性化旅游推荐路线.回顾她的学习历程,她为期望入门自然语言处理的初学者列出了一份学习资源清单. ...