mysql: 三个范式
来源:互联网 发布:淘宝白菜用什么app 编辑:程序博客网 时间:2024/05/16 08:24
第一范式
原子性。表的元组不可再拆分成更小的元组。
第二范式
非主键必须完全依赖主键,而不是仅仅依赖主键的一部分。
举个例子,美国销售军火的时候,对每一样武器,根据国家或地区的不同而给出不同的价格。建个表看看:
CREATE TABLE weapon_price(wp_id UNSIGNED INT NOT NULL AUTO_INCREMENT, -- 武器编号cs_id UNSIGNED INT NOT NULL , -- 消费者 id wp_price UNSIGNED INT NOT NULL, -- 武器价格, 根据武器买主的不同而不同cs_name VARCHAR(40) NOT NULL -- 消费者的称呼,例如 台湾/菲律宾/韩国);
weapon_price 用于描述武器的价格,价格根据(武器,消费者)的不同而不同。对于此表 (wp_id,cs_id) 是其主键。其中 wp_price 是完全依赖于 (wp_id,cs_id) 的,而 cs_name 则只依赖于 cs_id ,即只依赖于主键的一部分。
这种情况导致的问题是什么呢?
- 增:造成冗余。cs_name 重复出现,如果有许多武器的买主都是台湾,那么 cs_name 就会在这张表中出现很多次,造成浪费。
- 删:无
- 改:假如"菲律宾"后来改名了,那么数据库管理者不得不把表中所有 相关的 cs_name 全都改一遍。
- 查:无
如何应对呢?
把 cs_name 挪到别的表里,本来吗,学过数据库的人都知道,可以建一个 consumer 表,其中含 (cs_id,cs_name) 两个元组。
第三范式
满足第二范式并且每个元组都不传递依赖于主键列。
CREATE TABLE province( pr_id UNSIGNED INT NOT NULL AUTO_INCREMENT, -- 主键 pr_name VARCHAR(20) NOT NULL, -- 省份名, 完全依赖于主键, pr_id 定了, pr_name 就定了 PRIMARY KEY(pr_id));CREATE TABLE city( ct_id UNSIGNED INT NOT NULL AUTO_INCREMENT, -- 主键 ct_name VARCHAR(20) NOT NULL, -- 完全依赖于主键,ct_id 定了,ct_name 就定了 pr_id UNSIGNED INT NOT NULL , -- 完全依赖于主键,ct_id 定了,就可以确定 pr_id pr_name VARCHAR(20) NOT NULL, -- 完全依赖于主键,ct_id 定了,就可以确定 pr_name PRIMARY KEY(ct_id), FOREIGN KEY(pr_id) REFERENCES province(pr_id) ON DELETE CASCADE);
上述的这两张表都满足第二范式,不过,注意到 city 表中的 pr_name 元组虽然完全依赖于 ct_id , 但是它是通过 pr_id 传递依赖于 ct_id 的。
传递依赖的坏处:
- 增:明显 pr_name 出现冗余。
- 删:无
- 改:改动 province 表的 pr_name 元组,也要同时修改 city 表中的 pr_name 。一不小心就出问题。
- 查:无
结语
平时小打小闹似乎用不上范式,因为设计出来的表总是自然而然地满足范式的要求。不过,对于范式,还是"理解"万岁吧~
- mysql: 三个范式
- mysql: 三个范式
- mysql的三个范式
- 关于MySql三个范式的理解
- 三个范式
- 三个范式
- 三个范式
- sql 三个范式
- 三个范式的理解
- 数据库三个范式
- 学习三个范式
- 数据库的三个范式
- 数据库的三个范式
- 古老的 三个范式
- 数据库设计 三个范式
- 数据库的三个范式
- 数据库的三个范式
- 数据库表三个范式
- 经常出现1年以上的员工离职,怎样给员工未来的发展一个明确的定位?
- 如何用W7100A实现HTTP客户端(一)
- NS_AF_NONE, NS_AF_ILINK, NS_AF_INET解释
- Java schedule与scheduleAtFixRate区别
- C++中main函数的悲哀
- mysql: 三个范式
- web压力测试工具之ab
- 网页~点击换图片code
- OpenFlow 1.1 Software Switch
- android2.3 MODIFY_PHONE_STATE
- Socket 编程,一个服务器,多个客户端,互相通信
- jsp路径
- JAVA WEB 自定义标签
- Probe方式探测i2c设备,i2c_client与i2c_driver相关联