怎样高效的使用mysql一些示例
2011-07-25 22:31
387 查看
这 听上去是常识,但人们常常采取“厨房下水道”的方式进行数据库设计。他们认为可能项要得每样东西都要存储并设计数据库保存所有者这些数据。你需要对你的需 求现实些,并确定取确实需要什么信息。你常常能随意产生一些数据而不把它存在数据库表中。在这种情况下,从一个应用开发者的角度看也有道理这样做。
例 如,在线目录的产品表可能包含各种产品的名称、介绍、尺寸、重量和价格。除了价格,你可能想存储每个项目相关的税和运输成本。但实际上不必这样做。首先税 和运输成本可以方便地(由你的应用或MySQL)计算出来。其次,如果税和运输成本改变了,你可能必须编写必要的查询更新每个产品记录中的税和运输的费 率。
有时人们认为这太难不能在以后往数据库表中加入字段,所以他们感觉不得不定义尽可能多的列。这是明显的概念错误。在MySQL中,你可以用ALTER TABLE命令方便地修改表定义以适应你改变的需求。
例如,如果你突然认识到你需要给你的产品表增加一个级别列(可能你想允许用户在你的目录中给产品评级),你可以这样做:
ALTER TABLE products ADD rank INTEGER
这给你的产品表增加了一个整数类型的级别列,你能用ALTER TABLE做什么的完整介绍参见MySQL手册。
只要求你需要的东西–要清晰
就像说“只存储你需要的东西”那样,这可能看来是常识,但这一点常常被忽视,为什么呢?因为在一个应用开发时,需求经常改变,所以很多查询最终看来是这样:
SELECT * FROM sometable
当你不能肯定你将需要哪一列时,要求所有列明显是最省力的事情,然而随着你的表不断增大和修改,这可能变成一个性能问题。最好是在你的最初开发完成后再花些时间并确定你真正从你的查询中需要什么:
SELECT name, rank, pdfdescription FROM pdfproducts
这带来了一个相关的观点,即代码维护比性能更重要。大多数变成语言(Perl、Python、PHP、Java等)允许通过字段名和数字编号访问一条查询的结果,这意味着你可以访问命名字段或字段0都可以得到相同的数据。
长期看,最好使用列名而不是其编号位置,为什么?因为一个表中或一条查询中地列的相对位置可以改变。它们在表中可能因为重复使用ALTER TABLE而改变,它们在查询中将因重写了查询而忘记更新应用逻辑来匹配而改变。
当然,你仍然需要小心改变列名!但如果你使用列名而非标号位置,如列名改变,你可以用grep搜索源代码或使用编辑器的搜索能力查找你需要修改的代码。
规范化你的表结构
如果你以前从未听说过“数据规范化”,不要害怕。规范化可能是一个复杂的专题,你可以从只理解最基本的规范化概念中正真正获益。
理解它的最容易的方法是认为你的表是一个电子报表。如果你想以一个报表跟踪你的CD收藏,你可以如图1种那样进行设计:
图1
引用
album track1 track2 track10
—– —— —— ——-
Billboard Top Hits – 1984 Loverboy Shout St. Elmo’s Fire
(Billy Ocean) (Tears for Fears) (John Parr)
这看上去很合理。大多数CD只有10首曲子,对否?不尽然。如果你拥有一张有100首曲子的CD且几张超过20首改怎么办。这意味着用这种方法,在极端的情况下,你将需要一个非常宽的表格(或一个超过100个字段的表)来保存所有的数据。
规 范化表结构的目标是使“空单元”的数量最少,在上述CD表的买卖IC网情况下,如果你允许CD可能包含100首曲子,你会有很多这样的空单元。不管你何时处理可能扩 展到类似该CD表那样数量的字段列表,它是你需要将你的数据分割成2个或更多表的标志,然后你一起访问并获得你需要的数据。
很多关系数据库的新手不真正知道关系数据库管理系统中关系是什么。简单地说,就像一组信息存在可以基于共性数据联结(JOIN)在一起的不同表中,很不幸,这听上去更学术化和含糊,但CD数据库提出了一个具体情况,我们可以研究如何规范数据。
每个买卖IC网CD列表有一个固定的属性(标题、艺术家、年份、分类)集和一个不定的属性(曲目表)集的理解给了我们一些如何分成成能相互关联的表的思路。
你可以创建一个所有专辑及其固定属性的表,另一个包含这些专辑的所有曲目的表。这样不是水平思考(像表格),你垂直思考–就好像你创建列表而不是行–并建立一个如图2的表结构:
点击查看大图
专辑的编号(MySQL镜自动为你生成,因为我们在列上使用了AUTO_INCREMENT属性)关联不同曲目到一给定专辑,tracks表中的album_id字段匹配专辑表中的一个id。这样要获得给定专辑的所有曲目
例 如,在线目录的产品表可能包含各种产品的名称、介绍、尺寸、重量和价格。除了价格,你可能想存储每个项目相关的税和运输成本。但实际上不必这样做。首先税 和运输成本可以方便地(由你的应用或MySQL)计算出来。其次,如果税和运输成本改变了,你可能必须编写必要的查询更新每个产品记录中的税和运输的费 率。
有时人们认为这太难不能在以后往数据库表中加入字段,所以他们感觉不得不定义尽可能多的列。这是明显的概念错误。在MySQL中,你可以用ALTER TABLE命令方便地修改表定义以适应你改变的需求。
例如,如果你突然认识到你需要给你的产品表增加一个级别列(可能你想允许用户在你的目录中给产品评级),你可以这样做:
ALTER TABLE products ADD rank INTEGER
这给你的产品表增加了一个整数类型的级别列,你能用ALTER TABLE做什么的完整介绍参见MySQL手册。
只要求你需要的东西–要清晰
就像说“只存储你需要的东西”那样,这可能看来是常识,但这一点常常被忽视,为什么呢?因为在一个应用开发时,需求经常改变,所以很多查询最终看来是这样:
SELECT * FROM sometable
当你不能肯定你将需要哪一列时,要求所有列明显是最省力的事情,然而随着你的表不断增大和修改,这可能变成一个性能问题。最好是在你的最初开发完成后再花些时间并确定你真正从你的查询中需要什么:
SELECT name, rank, pdfdescription FROM pdfproducts
这带来了一个相关的观点,即代码维护比性能更重要。大多数变成语言(Perl、Python、PHP、Java等)允许通过字段名和数字编号访问一条查询的结果,这意味着你可以访问命名字段或字段0都可以得到相同的数据。
长期看,最好使用列名而不是其编号位置,为什么?因为一个表中或一条查询中地列的相对位置可以改变。它们在表中可能因为重复使用ALTER TABLE而改变,它们在查询中将因重写了查询而忘记更新应用逻辑来匹配而改变。
当然,你仍然需要小心改变列名!但如果你使用列名而非标号位置,如列名改变,你可以用grep搜索源代码或使用编辑器的搜索能力查找你需要修改的代码。
规范化你的表结构
如果你以前从未听说过“数据规范化”,不要害怕。规范化可能是一个复杂的专题,你可以从只理解最基本的规范化概念中正真正获益。
理解它的最容易的方法是认为你的表是一个电子报表。如果你想以一个报表跟踪你的CD收藏,你可以如图1种那样进行设计:
图1
引用
album track1 track2 track10
—– —— —— ——-
Billboard Top Hits – 1984 Loverboy Shout St. Elmo’s Fire
(Billy Ocean) (Tears for Fears) (John Parr)
这看上去很合理。大多数CD只有10首曲子,对否?不尽然。如果你拥有一张有100首曲子的CD且几张超过20首改怎么办。这意味着用这种方法,在极端的情况下,你将需要一个非常宽的表格(或一个超过100个字段的表)来保存所有的数据。
规 范化表结构的目标是使“空单元”的数量最少,在上述CD表的买卖IC网情况下,如果你允许CD可能包含100首曲子,你会有很多这样的空单元。不管你何时处理可能扩 展到类似该CD表那样数量的字段列表,它是你需要将你的数据分割成2个或更多表的标志,然后你一起访问并获得你需要的数据。
很多关系数据库的新手不真正知道关系数据库管理系统中关系是什么。简单地说,就像一组信息存在可以基于共性数据联结(JOIN)在一起的不同表中,很不幸,这听上去更学术化和含糊,但CD数据库提出了一个具体情况,我们可以研究如何规范数据。
每个买卖IC网CD列表有一个固定的属性(标题、艺术家、年份、分类)集和一个不定的属性(曲目表)集的理解给了我们一些如何分成成能相互关联的表的思路。
你可以创建一个所有专辑及其固定属性的表,另一个包含这些专辑的所有曲目的表。这样不是水平思考(像表格),你垂直思考–就好像你创建列表而不是行–并建立一个如图2的表结构:
点击查看大图
专辑的编号(MySQL镜自动为你生成,因为我们在列上使用了AUTO_INCREMENT属性)关联不同曲目到一给定专辑,tracks表中的album_id字段匹配专辑表中的一个id。这样要获得给定专辑的所有曲目
相关文章推荐
- 开发工作中使用过的mysql的一些总结
- 怎样在hibernate的HQL语句中使用mysql 的自定义函数?
- 使用mysql-5.7.17-winx64遇到的一些问题
- MySQL的一些其他插入数据的方式,顺便给大家脑补一点基本函数的使用
- mysql中使用ON DUPLICATE KEY UPDATE 示例
- php示例代码之使用list函数和mysql_fetch_row函数
- mysql的group_concat函数使用示例
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- Mysql存储过程循环内嵌套使用游标示例
- 解决Java程序使用MySQL时返回参数为乱码的示例教程
- MYSQL使用简述-连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令
- procedure在Mysql和Sql Server中使用的一些区别
- MySql 存储过程使用游标循环插入数据示例
- MySQL之mysql客户端工作的批处理一些使用手法
- 【MySQL】个人工作中的一些使用总结(1)
- PHP操作文件的一些基本函数使用示例
- MySql 存储过程使用游标循环插入数据示例
- MySQL中select语句介绍及使用示例
- mysql实际使用过程中碰到的一些有…
- jquery必须知道的一些常用特效方法及使用示例(整理)