2009 年 05 月

浏览模式: 标准 | 列表 | 图文
jQuery性能优化指南(3)

jQuery性能优化指南(3)

原文来自:https://docs.google.com/View?docID=dft4vhq9_23cnccgwc7&revision=_latest

8,尽量使用ID代替Class。

前面性能优化已经说过,ID选择器的速度是最快的。所以在HTML代码中,能使用ID的尽量使用ID来代替class。
看下面的一个例子:

// 创建一个list
var $myList = $('#myList');
var myListItems = '<ul>';
for (i = 0; i < 1000; i++) {
myListItems += '<li class="listItem' + i + '">This is a list item</li>'; //这里使用的是class
}
myListItems += '</ul>';
$myList.html(myListItems);
// 选择每一个 li
for (i = 0; i < 1000; i++) {
var selectedItem = $('.listItem' + i);
}

在代码最后,选择每个li的过程中,总共用了5066毫秒,超过5秒了。

接着我们做一个对比,用ID代替class:

// 创建一个list
var $myList = $('#myList');
var myListItems = '<ul>';
for (i = 0; i < 1000; i++) {
myListItems += '<li id="listItem' + i + '">This is a list item</li>'; //这里使用的是id
}
myListItems += '</ul>';
$myList.html(myListItems);
// 选择每一个 li
for (i = 0; i < 1000; i++) {
var selectedItem = $('#listItem' + i);
}
在上段代码中,选择每个li总共只用了61毫秒,相比class的方式,将近快了100倍。
9,给选择器一个上下文

jQuery选择器中有一个这样的选择器,它能指定上下文。
jQuery( expression, context );

通过它,能缩小选择器在DOM中搜索的范围,达到节省时间,提高效率。
普通方式:
$('.myDiv')
改进方式:
$('.myDiv' , $("#listItem") )

10,慎用 .live()方法(应该说尽量不要使用)

这是jQuery1.3.1版本之后增加的方法,这个方法的功能就是为 新增的DOM元素 动态绑定事件。
但对于效率来说,这个方法比较占用资源。所以请尽量不要使用它。
例如有这么一段代码:

<script type="text/javascript" >
$(function(){
$("p").click(function(){
alert( $(this).text() );
});
$("button").click(function(){
$("<p>this is second p</p>").appendTo("body");
});
})
</script>
<body>
<p>this is first p</p> <button>add</button>
</body>

运行后,你会发现 新增 的 p元素,并没用被绑定click事件。

你可以改成.live("click")方式解决此问题,代码如下:

$(function(){
$("p").live("click",function(){ //改成live方式
alert( $(this).text() );
});
$("button").click(function(){ $("<p>this is second p</p>").appendTo("body"); });
})

但我并不建议大家这么做,我想用另一种方式去解决这个问题,代码如下:

$(function(){
$("p").click(function(){
alert( $(this).text() );
});
$("button").click(function(){
$("<p>this is second p</p>").click(function(){ //为新增的元素重新绑定一次
alert( $(this).text() );
}).appendTo("body");
});
})

虽然我把绑定事件重新写了一次,代码多了点,但这种方式的效率明显高于live()方式,
特别是在频繁的DOM操作中,这点非常明显。


11,子选择器和后代选择器

后代选择器经常用到,比如:$("#list p");
后代选择器获取的是元素内部所有元素。

而有时候实际只要获取 子元素,那么就不应该使用后代选择器。
应该使用子选择器,代码如下:
$("#list > p");

12,使用data()方法存储临时变量

下面是一段非常简单的代码,

$(function(){
var flag = false;
$("button").click(function(){
if(flag){
$("p").text("true");
flag=false;
}else{
$("p").text("false");
flag=true;
}
});
})

改用data()方式后,代码如下:

$(function(){
$("button").click(function(){
if( $("p").data("flag") ){
$("p").text("true");
$("p").data("flag",false);
}else{
$("p").text("false");
$("p").data("flag",true);
}
});

})
jQuery性能优化指南(3)到此结束。
相信你也有你的idea,请共享出来吧。 Email : cssrain@gmail.com
jQuery性能优化指南(2)

jQuery性能优化指南(2)

原文来自:https://docs.google.com/View?docID=dft4vhq9_22g93szvdd&revision=_latest

4,对直接的DOM操作进行限制
这里的基本思想是在内存中建立你确实想要的东西,然后更新DOM 。
这并不是一个jQuery最佳实践,但必须进行有效的JavaScript操作 。直接的DOM操作速度很慢。

例如,你想动态的创建一组列表元素,千万不要这样做,如下所示:

var top_100_list = [...], // 假设这里是100个独一无二的字符串
$mylist = $("#mylist"); // jQuery 选择到 <ul> 元素
for (var i=0, l=top_100_list.length; i<l; i++){
$mylist.append("<li>" + top_100_list[i] + "</li>");
}

我们应该将整套元素字符串在插入进dom中之前先全部创建好,如下所示:

var top_100_list = [...],$mylist = $("#mylist"), top_100_li = ""; // 这个变量将用来存储我们的列表元素
for (var i=0, l=top_100_list.length; i<l; i++){
top_100_li += "<li>" + top_100_list[i] + "</li>";
}
$mylist.html(top_100_li);
注:记得以前还看过一朋友写过这样的代码:
for (i = 0; i < 1000; i++) {
var $myList = $('#myList');
$myList.append('This is list item ' + i);
}

呵呵,你应该已经看出问题所在了。既然把#mylist循环获取了1000次!!!

5,冒泡

除非在特殊情况下, 否则每一个js事件(例如:click, mouseover等.)都会冒泡到父级节点。
当我们需要给多个元素调用同个函数时这点会很有用。

代替这种效率很差的多元素事件监听的方法就是, 你只需向它们的父节点绑定一次。

比如, 我们要为一个拥有很多输入框的表单绑定这样的行为: 当输入框被选中时为它添加一个class

传统的做法是,直接选中input,然后绑定focus等,如下所示:

$("#entryform input").bind("focus", function(){
$(this).addClass("selected");
}).bind("blur", function(){
$(this).removeClass("selected");
});

当然上面代码能帮我们完成相应的任务,但如果你要寻求更高效的方法,请使用如下代码:

$("#entryform").bind("focus", function(e){
var $cell = $(e.target); // e.target 捕捉到触发的目标元素
$cell.addClass("selected");
}).bind("blur", function(e){
var $cell = $(e.target);
$cell.removeClass("selected");
});
通过在父级监听获取焦点和失去焦点的事件,对目标元素进行操作。
在上面代码中,父级元素扮演了一个调度员的角色, 它可以基于目标元素绑定事件。
如果你发现你给很多元素绑定了同一个事件监听, 那么现在的你肯定知道哪里做错了。
同理,在Table操作时,我们也可以使用这种方式加以改进代码:
普通的方式:
$('#myTable td').click(function(){
$(this).css('background', 'red');
});

改进方式:

$('#myTable').click(function(e) {
var $clicked = $(e.target);
$clicked.css('background', 'red');
});
假设有100个td,在使用普通的方式的时候,你绑定了100个事件。
在改进方式中,你只为一个元素绑定了1个事件,
至于是100个事件的效率高,还是1个事件的效率高,相信你也能自行分辨了。

6,推迟到 $(window).load

jQuery对于开发者来说有一个很诱人的东西, 可以把任何东西挂到$(document).ready下。
尽管$(document).rady 确实很有用, 它可以在页面渲染时,其它元素还没下载完成就执行。
如果你发现你的页面一直是载入中的状态,很有可能就是$(document).ready函数引起的。

你可以通过将jQuery函数绑定到$(window).load 事件的方法来减少页面载入时的cpu使用率。
它会在所有的html(包括<iframe>)被下载完成后执行。

$(window).load(function(){
// 页面完全载入后才初始化的jQuery函数.
});

一些特效的功能,例如拖放, 视觉特效和动画, 预载入隐藏图像等等,都是适合这种技术的场合。

7,压缩JavaScript
压缩和最小化你的JavaScript文件。
在线压缩地址: http://dean.edwards.name/packer/
压缩之前,请保证你的代码的规范性,否则可能失败,导致Js错误。
jQuery性能优化指南(2)到此结束,指南(3)正在进行中....
相信你也有你的idea,请共享出来吧。 Email : cssrain@gmail.com
jQuery性能优化指南(1)

jQuery性能优化指南(1)

原文来自:https://docs.google.com/View?docid=dft4vhq9_21hjb7j9fz&revision=_latest

1,总是从ID选择器开始继承

在jQuery中最快的选择器是ID选择器,因为它直接来自于JavaScript的getElementById()方法。

例如有一段HTML代码:

<div id="content">
<form method="post" action="#">
<h2>交通信号灯</h2>
<ul id="traffic_light">
<li><input type="radio" class="on" name="light" value="red" /> 红色</li>
<li><input type="radio" class="off" name="light" value="yellow" /> 黄色</li>
<li><input type="radio" class="off" name="light" value="green" /> 绿色</li>
</ul>
<input class="button" id="traffic_button" type="submit" value="Go" />
</form>
</div>

如果采用下面的选择器,那么效率是低效的。
var traffic_button = $("#content .button");

因为button已经有ID了,我们可以直接使用ID选择器。如下所示:
var traffic_button = $("#traffic_button");

当然 这只是对于单一的元素来讲。如果你需要选择多个元素,这必然会涉及到 DOM遍历和循环,
为了提高性能,建议从最近的ID开始继承。
如下所示:
var traffic_lights = $("#traffic_light input");


2,在class前使用tag(标签名)

在jQuery中第二快的选择器是tag(标签)选择器( 比如:$("head") )。
跟ID选择器累时,因为它来自原生的getElementsByTagName() 方法。

继续看刚才那段HTML代码:

<div id="content">
<form method="post" action="#">
<h2>交通信号灯</h2>
<ul id="traffic_light">
<li><input type="radio" class="on" name="light" value="red" /> 红色</li>
<li><input type="radio" class="off" name="light" value="yellow" /> 黄色</li>
<li><input type="radio" class="off" name="light" value="green" /> 绿色</li>
</ul>
<input class="button" id="traffic_button" type="submit" value="Go" />
</form>
</div>
比如需要选择 红绿 单选框,
那么可以使用一个tag name来限制(修饰)class ,如下所示:
var active_light = $("input.on");
当然也可以结合 就近的ID,如下所示:
var active_light = $("#traffic_light input.on");


在使用tag来修饰class的时候,我们需要注意以下几点:
(1) 不要使用tag来修饰ID,如下所示:
var content = $("div#content");
这样一来,选择器会先遍历所有的div元素,然后匹配#content。
(好像jQuery从1.3.1开始改变了选择器核心后,不存在这个问题了。暂时无法考证。)

(2)不要画蛇添足的使用ID来修饰ID,如下所示:
var traffic_light = $("#content #traffic_light");

注:如果使用属性选择器,也请尽量使用tag来修饰,如下所示:
$('p[row="c3221"]').html();而不是这样:$('[row="c3221"]').html();

3,将jQuery对象缓存起来

把jQuery对象缓存起来 就是要告诉我们 要养成将jQuery对象缓存进变量的习惯。
下面是一个jQuery新手写的一段代码:

$("#traffic_light input.on").bind("click", function(){ ... });
$("#traffic_light input.on").css("border", "1px dashed yellow");
$("#traffic_light input.on").css("background-color", "orange");
$("#traffic_light input.on").fadeIn("slow");

但切记不要这么做。

我们应该先将对象缓存进一个变量然后再操作,如下所示:

var $active_light = $("#traffic_light input.on");
$active_light.bind("click", function(){ ... });
$active_light.css("border", "1px dashed yellow");
$active_light.css("background-color", "orange");
$active_light.fadeIn("slow");

记住,永远不要让相同的选择器在你的代码里出现多次.

注:(1)为了区分普通的JavaScript对象和jQuery对象,可以在变量首字母前加上 $ 符号。
(2)上面代码可以使用jQuery的链式操作加以改善。如下所示:

var $active_light = $("#traffic_light input.on");
$active_light.bind("click", function(){ ... })
.css("border", "1px dashed yellow")
.css("background-color", "orange")
.fadeIn("slow");

如果你打算在其他函数中使用jQuery对象,那么你必须把它们缓存到全局环境中。
如下代码所示:

// 在全局范围定义一个对象 (例如: window对象)
window.$my = {
head : $("head"),
traffic_light : $("#traffic_light"),
traffic_button : $("#traffic_button")
};
function do_something(){
// 现在你可以引用存储的结果并操作它们
var script = document.createElement("script");
$my.head.append(script);
// 当你在函数内部操作是, 可以继续将查询存入全局对象中去.
$my.cool_results = $("#some_ul li");
$my.other_results = $("#some_table td");
// 将全局函数作为一个普通的jquery对象去使用.
$my.other_results.css("border-color", "red");
$my.traffic_light.css("border-color", "green");
}

//你也可以在其他函数中 使用它

jQuery性能优化指南(1)到此结束,请查看指南(2)。

精通MYSQL数据库——连载十六

精通MYSQL数据库——连载十六

将数据库转为范式的过程中,需要把一系列数据表关联起来,这种关联用数据库术语来说就是“关系”。一般来说,两个数据表之间的关系大致有三种:
1、1:1关系。两个表之间是1:1,代表了第一个数据表里的每一条记录分别对应着第二个数据表里的一条记录,同时第二个表的记录也分别对应着第一个表中的一条记录,实际工作中,很少见到这种关系,因为既然是1:1,那么证明他们是可以合并为一张表的(但在WEB处理的时候就不是这样,比如用户基本信息,用户扩展信息,他们肯定是1:1的,但如果扩展信息中有TEXT字段,而用户信息又经常被读取,那么我们就会把经常读取的字段分为一张表,不是经常读取的或者是含有TEXT内容的字段分拆为另外一张表,以加快读取速度。)
2、1:N关系。两个表之间是1:N,代表第一个数据表里的一条数据可以对应着第二个数据表里的多条记录。(大多数举例都是用工厂和产品来进行举例,从WEB方面来说,我们可以从用户表来分析,一个用户可以有多条地址簿,家庭、工作单位等,看淘宝在下单时选择地址就知道了)
3、N:M关系。两个表之间是N:M时,代表第一个数据表的一条记录可以对应着第二个数据表里的多条数据记录。同时第二个表中某条记录也可以对应着第一个数据表的多条记录。这里一般是用订单来做介绍:一个订单可以购买多个产品,一个产品也可能存在于多个订单中。

1:1关系
这种类型的表起源通常因为人们把某个数据表拆分成两个使用同一个主键的数据表。把1:1表分拆大致有两种原因,一种是信息安全方面考虑,还有一种就是上文说的效率方面的考虑。

1:N关系
1:N关系是最常见的两表之间的关系了。只要在第一个表的数据记录里有一个特定字段引用了第二个表中的数据列,就会形成1:N关系。
一般来说,1:N有点象1:1表,大多数情况下都是采用主键关联,只有这样才会保证1:N,而不是N:M,例如:分类表与文章表、用户表与地址簿表,论坛主题与跟贴,用户表与订单表,员工表与员工履历表等,这些都属于1:1表。

N:M关系
其实1:N在设计的不太好时,很容易就会变成N:M表。N:N表大致用于订单与产品、用户表与回贴表、员工表与考勤表等等

精通MYSQL数据库——连载十五

精通MYSQL数据库——连载十五

当你需要把分类表显示为树形时,肯定是需要进行一些妥协,就象前面文章中所说的,对数据进行这种处理意味着要无数的SQL查询命令或者复杂的客户端代码打交道。
可供选择的解决方案之一是在分类表中增加两列:sort,deepth,SORT字段负责给出各条数据记录将出现在层次关系树的第几行(假设同一层次的记录将分类名进行排序),DEEPTH字段则负责该分类所在的层次深度。
这种方式的好处是可以通过在MYSQL程序中执行下面这条简单查询的办法得到证明。例如:SELECT CONCAT( SPACE(deepth * 2) ,catename ) as category , sort , deepth FROM categories ORDER BY sort.其中concat函数的功能是把两个字符串并为一个,space函数的功能是生成指定个数的空格字符,AS关键字是给整个表达式起一个新的名字(别名,可能更容易理解一些)。
执行这样的SQL后,可以生成一个简单的树结构,树的尝试都是通过deepth的空格来显示的(这里显示简单的例子)
CATENAME          SORT    DEEPTH
主分类            0       0
一级分类          1       1
二级分类         2       2
重复一级分类         3       1
重复二级分类         4       2
三级分类           5       3
大致结构如上。
那么sort值和deepth的值是怎么来的呢?我们会进行一个简单的演示:
1、新建一个[新的三级分类],它被插入到[二级分类]下一级。而二级分类有关的数据是sort=2,deepth=2
2、那么我们首先要找到[二级分类]下是否已经有数据插入,SQL为:WHERE parentId = [二级分类]ID
3、将数据追加到二级分类下(即SORT+1,深度=)
4、更新相关数值
在这里面就涉及到一些问题,二级分类下如果有多个三级分类,三级分类还有四级分类,这时候SORT值的取值就比较难以控制。插入值后,它的SORT值其实是覆盖了原来的重复一级分类的SORT,那么,原来的SORT值>=当前SORT值的,都需要自动加1.
由此可见,虽然SORT值和DEEPTH值简化了查询工作,但实际上他的写操作变得频繁和复杂了。如果需要更新其中的一条记录,所涉及的操作还会更多。因为他必须要相应的调整sort值和deepth值。
因此,在实际情况中,你必须决定是对读操作进行优化还是对写操作进行优化。一般情况下,对于这种分类表,我都比较倾向于一次读出,然后利用 PHP语言进行深度的处理 也就是说,我是一般不会用SORT和DEEPTH字段的。因为大多数情况下,分类表都是一种比较固定的表,不大会读写,而在后台的读写,也不会影响到前台的操作。。

好象有点乱。

不会爬就会走会影响孩子的智力吗

不会爬就会走会影响孩子的智力吗

昨天上课的时候,副班长说了一例不会爬行影响社交的案例,回家查了一下网络,发现不会爬就直接会走导致的一些问题,现在记录下来,一是给自己点警惕,二来也是让看到本文的爸爸妈妈注意一下。

第一篇:(已经找不到原作者了,我在这里转载的:http://baby.qqyy.com/yeq/0904/30/14ffa.html)

  不会爬就会走的孩子不会影响智力,但的确容易出现心智问题。上海市人口与发展中心在母婴健康社区行的调研中显示,不会爬就会走的幼儿比例高达24.4%(61/250)。
人的脑神经系统是人所有活动的指挥中心,指挥中心拥有错综复杂的网络结构,目标是传递信号和发布命令。
但刚出生的宝宝脑指挥中心是不会指挥的,经过1年的工夫(即在婴儿时期),宝宝通过眼看、耳听、皮肤触、舌头味觉、鼻嗅等过程(医学上称感觉统合过 程),脑中的各种信号路径就建立和发达起来,这其中伴随着宝宝的运动能力的顺序发展,从3个月把头抬起来,5个月时会爬了,6-7个月孩子会坐了,9个月 孩子站起来,1岁会迈步行走,宝宝的运动发展直接影响感觉统合过程。
宝宝如果爬行少或爬行练习不足或没有经历爬行,将引起对称性颈紧张反射的 动作不成熟,表现为身体的上半部和下半部不自觉地对抗,就容易发生感觉统合失调症,如视觉和听觉不协调、视觉和动作不协调、听觉和动作不协调等。在幼儿期 家长还看不出危害,但当孩子上学后,危害就逐渐表现出来了,孩子情绪不稳定,固执、容易有侵略性,有挫折感、难适应学习环境、注意力不集中,不能持久地干 一件事情,不能长时间坐着,身体动来动去等,这些都直接影响孩子的学业和社会交往能力。那时家长就会着急了,感到孩子脑子挺聪明,可是怎么学习能力这样 差,老在学校闯祸呢。
可见,智力和心智不是一回事,感觉统合失调症就是心智方面异常了。并不是所有不会爬就会走的孩子都将影响心智,不过出现 不同程度心智异常的比例是非常高的。对于错过爬行期的孩子,家长不必紧张,也不能消极等待,应该积极尽早补上爬行环节(即进行运动性心智训练)。预防感觉 统合失调发生,这才是明智之举。

第二篇 :http://www.psytopic.com/mag/post/1024.html

爬行不是必经阶段:虽然大多数宝宝都会经过爬这个阶段,但爬行并不是宝宝生长发育的必经阶段。爬行是宝宝从会坐到会站、会走的一个过渡动作,也就是说,爬行是宝宝站、走的准备动作。而有的宝宝并不经历爬的阶段而直接学会站和走,妈妈也不必为此担心。

爬行好处多多:虽然说爬行不是必经阶段,但是爬行对宝宝的成长,的确好处多多。
首先,爬需要抬高并左右转动头部,还需要胳膊及手腕的力量支撑整个上半身,因此有利于强化宝宝手、脚、颈部的关节,并使腹部、颈部、四肢的骨骼关节和小肌肉群得到锻炼,可促进骨骼的生长、增强体力,并为将来的动作发展打下基础。

其次,爬行时,需要上肢及下肢的共同参与,是全身的协调动作,因此爬行可以增进大脑对四肢及眼睛的控制能力,锻炼手、脚、眼的协调性,有效预防感觉统合失调。

最 后,充分爬行可扩大孩子的活动范围,扩展他的视野,能促进大脑发育,开发孩子智力潜能。当孩子在襁褓中时,视听所及的范围很小;当他坐着或躺着时,视听范 围略有扩大,但得到的刺激仍然不多;而当孩子在会爬行时,姿态由静到动,范围由点到面,他所接触和观察到的事物逐渐增多,认识世界的范围也在扩大。同时, 他的思维、语言与想像能力也相应地得到了发展与提高。

建议
一.不会爬的宝宝怎么办?
1.多提供机会:宝宝在三四个月大时,如果老把宝宝放在推车里,宝宝很难有机会主动去爬。
2.模仿爬行:有些宝宝不会爬,可能是因为不知道怎么做。小宝宝的模仿能力极强,这时可以找一个会爬的小朋友来玩,两个宝宝在一起,鼓励他们爬。当宝宝看到另外的小伙伴爬行时,他也就会模仿,很快学会爬。
3. 适当辅助:当有些宝宝不会爬,这时父母就要略微帮点忙了!宝宝在爬行时四肢如何协调一致地运动是个最大的难题,他们经常是顾得了手却顾不了脚。这时父母可 以站在宝宝身后,两个手掌放在宝宝脚底,推动宝宝一只脚,当他往前爬一点时,再推动另一只脚,如此协助,帮他渡过爬行关。

二.会爬,但是不太爱爬的宝宝怎么办?
1. 创造良好环境:选择一个宽敞安全的地方作为宝宝的小小游乐区,将宝宝趴着放在地面上,在宝宝面前150公分左右的地方放一个宝宝喜欢的玩具。玩具能够吸引 宝宝的注意力,促使宝宝向前移动身体。宝宝爬过来时,妈妈可以一点点往后腿,让宝宝向前爬得更多。当宝宝够到玩具时,要让宝宝玩一会儿,并表扬宝宝,增强 他的成就感。

2.增加爬行的趣味性:家里若是有装冰箱、洗衣机的空纸箱,可以制成宝宝的爬行玩具。将纸箱横放在地上,把宝宝放在纸箱一头,然后妈妈到另一边,从纸箱里看宝宝,鼓励他(她)钻“山洞”,爬到妈妈这边来。宝宝早晨起来时,妈妈还可以让宝宝从被子的这头爬到另一头。

爱心小提示:有的宝宝在爬行时,一侧身体无力,需要另一条腿拖着向前移,并伴有其他动作发展迟缓时,妈妈就要小心了。最好去医院做个检查,排除神经系统发育障碍和一些脑损伤状况。

精通MYSQL数据库——连载十四

精通MYSQL数据库——连载十四

分类表是一种典型的层次化关系的表,从数据库设计工作的角度看,让每个分类记录的parentId字段指向它们父分类的Id即可。
把层次关系转化为数据表并不困难,而且层次还相对比较清晰,但在这种表面现象的背后还有许多难题在等待着用户解决。比如,我们无法只用一个简单的SELECT就把指定分类的父分类或者子分类全部查询出来,而必须通过多次查询才能解决这个问题(或者一次查出后,用程序来进行处理)。
事实上,数据库设计和SQL编程有着千丝万缕的联系,很难将他们完全区分开来,再者,如果SQL不足以把想要查询的数据从数据表里提取出来,那么,想拿出一个优秀的数据为设计方案就只能是一句空谈。
想要通过数据表去管理和使用层次关系,得解决很多难题,而这些难题几乎都与SQL语言不能递归查询这一事实有关。以分类表为例:
1、只用一个查询就把指定分类的所有父分类全部查出来是不可能的
2、把完整的数据表还原为层次关系(树状)也是一个难点,还是必须执行多次SQL才能完成。
3、把指定分类下所有子分类全部查询出来
4、设计时,一个分类不能有两个父分类(例如:sql语言既能够放在database分类中,但好象放在programming分类下也行,因此,如果sql语言有两个父分类仿佛才是合理的)
5、层次关系最担心 的是留下循环引用隐患(比如手工删除数据或者添加数据时,很容易导致第4条的情况发生,数据库层次断链或者重复等)
虽然有这些存在的问题,但并非不可解决,而从上面这些难点来说,层次关系往往会导致即使是一个相对简单的问题也需要很多条SQL查询才能得出答案,而且整个过程都相当慢。如果不使用层次关系(或者使用有限的层次关系),上述问题即都可以避免。如果必须使用多级的层次关系,增 加一些数据列或数据表来提供更多关于层次关系的信息,将有助于层次关系的解决方案变得简单一些。
从范式的标准来说,冗余是不对的,它会导致存储空间不必要的浪费,增加数据库内部管理工作的负担,但为了提高应用程序的执行效率,冗余反而是一种相当简明的解决方案,因此,数据库设计其实是一件多方妥协和折中的事。在数据库领域,通往同一个目标的道路往往有好多条,选择其中的任意一条,都意味着作出了这样或那样的妥协。做出什么样的妥协最有利这往往取决于数据库的具体使用情况:什么类型的查询发生的最为频繁?数据需不需要频繁修改?

我,嫉妒了

我,嫉妒了

说实话,我真的嫉妒了。。。
看到这个标题,《熟悉十多种编程语言 9岁娃玩电脑堪比专家》,我真的嫉妒了。

看看:不到一个月建成个人网站 开发自己名字命名的操作系统“我还要在自己的系统中开发文档浏览、听音乐、看视频、浏览器等功能,将软件打造成为完全属于自己的软件。

再看看,他:
利用网上没有版权的操作系统内核,开发了自己的操作系统,而且,又渐渐学会了C语言、VF(VisualFoxpro)、VB(Visual Basic)、VC、VC++、BASIC、Pascal、PHP(HypertextPreprocessor)、JAVA、 ASP(ActiveServerPage)等语言编程。

还有:他的表现令中国科技大学少年班的老师感到惊奇

我嫉妒了。。。

原文:http://hi.baidu.com/phpscript/blog/item/01e14cd46f3865cc51da4b11.html

精通MYSQL数据库——连载十三

精通MYSQL数据库——连载十三

好久好久没有写了。。。重拾起来,确实有点困难,不过,这次是坚持了。

关系数据库的三个范式最早是著名学者E.F.Codd提出来的,后人又在此基础上对大到数学集合理论,小到加设计细节等诸多方面进行了研究和探索。
有些数据库类图书在介绍三个范式时,又在其基础上增加了一些所谓的范式,但这些范式在实践中重要性不大。他们及其相应的规则只是把标准三个范式的所做的事情描述的更细致而己,这些充斥着“实体”、“属性”等专业术语却又彼此大致雷同的教条不仅没有把事情说清楚,反而会让人们更看不出它们与加有什么联系。
如果确实对数据库非常感兴趣,有一些书值得读读(我没有读过,但我现在看的书的原作者推荐):"SQL for smarties","The Practical SQL handbook","Database for mere mortals","SQL-99 complete,really"
当然如果你对读这些书的意向不大(我也意向不大,英文的,估计看不懂),那么如何很快就能上手呢?这里有一些简单的方法:
1、在设计数据库的时候,一定要给自己以充足的时间,如果数据库里已经充满了数据,而且配套的程序也已经开发完成的时候,再发现数据库设计方案还需要修改,那么花费的时间和精力可就太大了
2、如果发现自己给数据列起的名字中有序号,比如field1,field2之类的,则应该提高警惕,这种现象几乎上增加了 是意味着还有更好的解决方案没有想到——再多创建一个数据表
3、在第一时间向数据库输入一些测试用途的数据,而且要尽可能地多包括一些特殊情况,如果数据出现冗余,往往是应该把数据表拆分 的提示信号(但有时候也未必,比如用空间换时间的时候就需要冗余,这点在WEB应用上尤其明显)
4、注意发现和运用各个数据表之间的关联/引用关系
5、掌握SQL语言。缺少SQL编程经验的人是很验证拿出一个优秀数据库设计方案的。把信息存入数据库的目的是为了让更多人能够使用SQL查询命令把它们再迅速准备地查出来。只有了解了SQL查询命令的涉及范围,才能找出把数据分门别类地存入数据库的最佳办法
6、找个示例数据库做为借鉴(这个相对比较重要,比如你要开发论坛程序,那么你应该先找一些开源论坛进行安装,再对他们的数据库结构进行研究和借鉴是最快的学习方法)

MYSQL连载预告

MYSQL连载预告

原来的连载因为一些原因停了N久,从下周开始,每周继续连载。

这次,直至结束。
优化方面的事情以及MYSQL集群等,可能暂时不能涉及
仅涉及MYSQL最基本的一些资料,我想这也应该足够了吧?