Tag - MySQL

? MySQL ?    2016-03-02 22:30:27    325    0    0

数据库设计范式介绍

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF)

  • 第一范式(确保每列保持原子性)
    第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式

  • 第二范式(确保表中的每列都和主键完全依赖)
    需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中

  • 第三范式(在第二范式的基础上,消除传递依赖)
    需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关

当然还有更高的范式,单是它们的关系总是先满足1NF,然后在1NF上改进成2NF,以此类推,所以范式之间的关系可以用以下图表示:

第一范式

1NF是数据库设计的最基本范式,在关系型数据库中,如果一个域是原子的,并且该域的元素被认为是不可分的单元,我们就称符合这种设计的表满足1NF,比如下面一张商品表:
商品信息表

商品ID 商品名称 颜色 价格 商家名字 商家联系方式
1 韩版休闲裤 50.0 张三 13634589384
1 韩版休闲裤 60.0 张三 13634589384
2 欧式西装 140.0 李四 13234534543

这张表就符合1NF,每一列都不可再分。
1NF的缺点有以下
1. 数据冗余太大,商家名字和商家联系方式大量冗余
2. 更新异常,需要更改商家联系方式的时候,需要修改大量的信息
3. 插入异常,如果一个商家刚成立,没有发布商品,插入会导致异常
4. 删除异常,如果一个商家的商品全部删除,商家随着被删除
思考?
下面这收件地址张表符合1NF吗?

收件人 街道 详细地址
张三 江西省 赣州市 章贡区 钟楼大街 幸福小区503号楼22#

还有很

? MySQL ?    2016-02-18 22:44:33    35108    1    2

前言

我们知道在MySQL中有3种类型可以表示实数,分别是float,double和decimal。关于如何合理得使用这三种类型,网上的答案也层出不穷。但是究竟该选择哪一种类型,好像并没有统一的答案,接下来,将通过一个例子来说明什么情况下选择float,什么情况下选择double,什么情况下选择decimal。相信对这个例子的剖析之后,你就会明白什么时候用什么样的类型

实数类型

举个例子

假如我们有一张表,用来存储用户的积分,表定义如下:

  1. CREATE TABLE `f` (
  2. `f1` float(10,2) DEFAULT NULL
  3. ) ENGINE=InnoDB DEFAULT CHARSET=utf-8

然后向这个表里插入131072.32的积分值,如下所示

  1. mysql> insert into f value (131072.32);
  2. Query OK, 1 row affected (0.00 sec)
  3. mysql> select * from f;
  4. +-----------+
  5. | f1 |
  6. +-----------+
  7. | 131072.31 |
  8. +-----------+
  9. 1 row in set (0.00 sec)

然后会惊奇的发现,这个用户的积分少了0.01,虽然这0.01的积分并不足于引起我们的注意,但是问题还是来了

  1. 丢失数据是否是正常现象?
  2. 为什么会少0.01,有没有可能少0.02,或者少1,少10甚至少100?
  3. 怎么样才能让我们的数据准确?

官方怎么看数据丢失

首先遇到问题,第一想到的就是官方找答案,我们翻阅官方文档,关于float和double有这样一段描述

For FLOAT, the SQL standard permits an optional specification of the precision (but not the range of the exponent) in bits following the keywordFLOAT in parentheses. MySQL also supports this optional precisio