Warning: Cannot modify header information - headers already sent by (output started at D:\www\jerryshen\Vku8\wwwroot\jerry\wp-config.php:1) in D:\www\jerryshen\Vku8\wwwroot\jerry\wp-includes\feed-rss2.php on line 8
V酷吧 http://www.vku8.net/jerry 炫出自己 Thu, 10 Jun 2010 09:57:04 +0000 http://wordpress.org/?v=2.8 en hourly 1 Replace INTO与INSERT INTO的不同之处 http://www.vku8.net/jerry/index.php/2010/06/10/118/ http://www.vku8.net/jerry/index.php/2010/06/10/118/#comments Thu, 10 Jun 2010 09:57:04 +0000 jerryshen http://www.vku8.net/jerry/?p=118 Replace INTO和INSERT INTO的区别:
REPLACE的运行与INSERT很相似。只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。
注意:除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。
所有列的值均取自在REPLACE语句中被指定的值。所有缺失的列被设置为各自的默认值,这和INSERT一样。您不能从当前行中引用值,也不能在新行中使用值。如果您使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。
为了能够使用REPLACE,您必须同时拥有表的INSERT和DELETE权限。
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。如果对于一个单行REPLACE该数为1,则一行被插入,同时没有行被删除。如果该数大于1,则在新行被插入前,有一个或多个旧行被删除。如果表包含多个唯一索引,并且新行复制了在不同的唯一索引中的不同旧行的值,则有可能是一个单一行替换了多个旧行。
受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。
如果您正在使用C API,则可以使用mysql_affected_rows()函数获得受影响的行数。
目前,您不能在一个子查询中,向一个表中更换,同时从同一个表中选择。
下文时算法的详细说明(此算法也用于LOAD DATA…REPLACE):
1. 尝试把新行插入到表中;
2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时;
a. 从表中删除含有重复关键字值的冲突行;
b. 再次尝试把新行插入到表中
使用格式如下:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},…),(…),…
或:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name={expr | DEFAULT}, …
或:
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT …

]]>
http://www.vku8.net/jerry/index.php/2010/06/10/118/feed/ 0
数据库命令delete和truncate的区别 http://www.vku8.net/jerry/index.php/2010/06/10/116/ http://www.vku8.net/jerry/index.php/2010/06/10/116/#comments Thu, 10 Jun 2010 09:50:27 +0000 jerryshen http://www.vku8.net/jerry/?p=116 TRUNCATE和DELETE有以下几点区别
1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。
2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。
3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。
4、TRUNCATE不能触发任何DELETE触发器。
5、不能授予任何人清空他人的表的权限。
6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。
7、不能清空父表。 TRUNCATE TABLE (schema)table_name DROP(REUSE) STORAGE 在默认是 DROP STORAGE 当使用DROP STORAGE时将缩短表和表索引,将表收缩到最小范围,并重新设置NEXT参数。REUSE STORAGE不会缩短表或者调整NEXT参数在特殊情况下使用 REUSE ST
DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
TRUNCATE TABLE 则一次性地从表中删除所有的数据页并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

]]>
http://www.vku8.net/jerry/index.php/2010/06/10/116/feed/ 0
那些相见恨晚的 JavaScript 技巧 http://www.vku8.net/jerry/index.php/2010/04/26/114/ http://www.vku8.net/jerry/index.php/2010/04/26/114/#comments Mon, 26 Apr 2010 01:36:29 +0000 jerryshen http://www.vku8.net/jerry/?p=114 JavaScript 的成功让人津津乐道,为 Web 网页编写 JavaScript 代码已经是所有 Web 设计师的基本功,这门有趣的语言蕴藏着许多不为人熟知的东西,即使多年的 JavaScript 程序员,也未能完全吃透。本文从7个方面讲述 JavaScript 中那些你不很熟知但非常实用的技巧。

简略语句
JavaScript 可以使用简略语句快速创建对象和数组,比如下面的代码:

可以使用简略语句如下:

对象 car 就此创建,不过需要特别注意,结束花括号前一定不要加 “;” 否则在 IE 会遇到很大麻烦。

创建数组的传统方法是:

使用简略语句则:

另一个可以使用简略语句的地方是条件判断语句:

可以简略为:

JSON 数据格式
JSON 是 “JavaScript Object Notation” 的缩写,由 Douglas Crockford 设计,JSON 改变了 JavaScript 在缓存复杂数据格式方面的困境,如下例,假如你要描述一个乐队,可以这样写:

你可以在 JavaScript 中直接使用 JSON,甚至作为某些 API 的返回数据对象,以下代码调用著名书签网站 delicious.com 的一个 API,返回你在该网站的所有书签,并显示在你自己的网站:

JavaScript 本地函数 (Math, Array 和 String)
JavaScript 有很多内置函数,有效的使用,可以避免很多不必要的代码,比如,从一个数组中找出最大值,传统的方法是:

使用内置函数可以更容易实现:

另一个方法是使用 Math.max() 方法:

你可以用这个方法帮助探测浏览器

这解决了 IE 浏览器的一个问题,通过这种方法,你总是可以找到那个正确的值,因为浏览器不支持的那个值会返回 undefined。

还可以使用 JavaScript 内置的 split() 和 join() 函数处理 HTML 对象的 CSS 类名,如果 HTML 对象的类名是空格隔开的多个名字,你在为它追加或删除一个 CSS 类名的时候需要特别注意,如果该对象还没有类名属性,可以直接将新的类名赋予它,如果已经存在类名,新增的类名前必须有一个空格,用传统的 JavaScript 方法是这样实现的:

使用 split 和 join 方法则直观优雅得多:

事件代理
与其在 HTML 文档中设计一堆事件,不如直接设计一个事件代理,举例说明,假如你有一些链接,用户点击后不想打开链接,而是执行某个事件,HTML 代码如下:

传统的事件处理是遍历各个链接,加上各自的事件处理:

使用事件代理,可以直接处理,无需遍历:

匿名函数与 Module 模式
JavaScript 的一个问题是,任何变量,函数或是对象,除非是在某个函数内部定义,否则,就是全局的,意味着同一网页的别的代码可以访问并改写这个变量(ECMA 的 JavaScript 5 已经改变了这一状况 – 译者),使用匿名函数,你可以绕过这一问题。

比如,你有这样一段代码,很显然,变量 name, age, status 将成为全局变量

为了避免这一问题,你可以使用匿名函数:

如果这个函数不会被调用,可以更直接为:

如果要访问其中的对象或函数,可以:

这就是所谓 Module 模式或单例模式(Singleton),该模式为 Douglas Crockford 所推崇,并被大量应用在 Yahoo User Interface Library YUI。

假如你想在别的地方调用里面的方法,又不想在调用前使用 myApplication 这个对象名,可以在匿名函数中返回这些方法,甚至用简称返回:

代码配置
别人使用你编写的 JavaScript 代码的时候,难免会更改某些代码,但这会很困难,因为不是每个人都很容易读懂别人的代码,与其这样,不如创建一个代码配置对象,别人只需要在这个对象中更改某些配置即可实现代码的更改。这里有一篇 JavaScript 配置对象详解的文章,简单说:

在代码中创建一个叫做 configuration 的对象
里面保存所有可以更改的配置,如 CSS ID 和类名,按钮的标签文字,描述性文字,本地化语言设置
将该对象设置为全局对象,以便别人直接访问并改写
你应当在最后一步做这项工作,这里有一个文章,交付代码前的5件事值的参考。

同后台交互
JavaScript 是一门前台语言,你需要别的语言同后台交互,并返回数据,使用 AJAX,你可以让 JavaScript 直接使用同后台的交互,将复杂的数据处理交由后台处理。

JavaScript 框架
自己编写适应各种浏览器的代码是完全浪费时间,应当选择一个 JavaScript 框架,让这些复杂的事情交给框架处理。

更多资源
Douglas Crockford on JavaScript
JavaScript 深度视频教程
The Opera Web Standards Curriculum
JavaScript 详解
延伸阅读
有关 JavaScript 的 10 件让人费解的事情
新 API 寻求让 JavaScript 操作本地文件
让 JavaScript 拯救 HTML5 的离线存储
开源项目越来越青睐 JavaScript
Javascript 是一个错误吗?
Javascript 2 前途尘埃落定
Google 排名中的 10 个最著名的 JavaScript 库
ECMA 推出 JavaScript 5
本文国际来源:Smashing Magazine Seven JavaScript Things I Wish I Knew Much Earlier In My Career (原文作者:Christian Heilmann)

中文编译来源:锐商企业CMS 网站内容管理系统 官方网站

]]>
http://www.vku8.net/jerry/index.php/2010/04/26/114/feed/ 0
jQuery使用技巧 http://www.vku8.net/jerry/index.php/2010/04/22/112/ http://www.vku8.net/jerry/index.php/2010/04/22/112/#comments Thu, 22 Apr 2010 05:53:09 +0000 jerryshen http://www.vku8.net/jerry/?p=112 1、关于页面元素的引用
通过jquery的$()引用元素包括通过id、class、元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom定义的方法。

2、jQuery对象与dom对象的转换
只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意操作的是dom对象还是 jquery对象。
普通的dom对象一般可以通过$()转换成jquery对象。
如:$(document.getElementById(”msg”))则为jquery对象,可以使用jquery的方法。
由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
如:$(”#msg”)[0],$(”div”).eq(1)[0],$(”div”).get()[1],$(”td”)[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的:
$(”#msg”).html();
$(”#msg”)[0].innerHTML;
$(”#msg”).eq(0)[0].innerHTML;
$(”#msg”).get(0).innerHTML;

3、如何获取jQuery集合的某一项
对于获取的元素集合,获取其中的某一项(通过索引指定)可以使用eq或get(n)方法或者索引号获取,要注意,eq返回的是jquery对象,而 get(n)和索引返回的是dom元素对象。对于jquery对象只能使用jquery的方法,而dom对象只能使用dom的方法,如要获取第三个

元素的内容。有如下两种方法:
$(”div”).eq(2).html(); //调用jquery对象的方法
$(”div”).get(2).innerHTML; //调用dom的方法属性

4、同一函数实现set和get
Jquery中的很多方法都是如此,主要包括如下几个:
$(”#msg”).html(); //返回id为msg的元素节点的html内容。
$(”#msg”).html(”new content“);
//将“new content” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content

$(”#msg”).text(); //返回id为msg的元素节点的文本内容。
$(”#msg”).text(”new content“);
//将“new content” 作为普通文本串写入id为msg的元素节点内容中,页面显示new content

$(”#msg”).height(); //返回id为msg的元素的高度
$(”#msg”).height(”300″); //将id为msg的元素的高度设为300
$(”#msg”).width(); //返回id为msg的元素的宽度
$(”#msg”).width(”300″); //将id为msg的元素的宽度设为300

$(”input”).val(”); //返回表单输入框的value值
$(”input”).val(”test”); //将表单输入框的value值设为test

$(”#msg”).click(); //触发id为msg的元素的单击事件
$(”#msg”).click(fn); //为id为msg的元素单击事件添加函数
同样blur,focus,select,submit事件都可以有着两种调用方法

5、集合处理功能
对于jquery返回的集合内容无需我们自己循环遍历并对每个对象分别做处理,jquery已经为我们提供的很方便的方法进行集合的处理。
包括两种形式:
$(”p”).each(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]})
//为索引分别为0,1,2的p元素分别设定不同的字体颜色。

$(”tr”).each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})
//实现表格的隔行换色效果

$(”p”).click(function(){alert($(this).html())})
//为每个p元素增加了click事件,单击某个p元素则弹出其内容

6、扩展我们需要的功能
$.extend({
min: function(a, b){return a < b?a:b; },
max: function(a, b){return a > b?a:b; }
}); //为jquery扩展了min,max两个方法
使用扩展的方法(通过“$.方法名”调用):
alert(”a=10,b=20,max=”+$.max(10,20)+”,min=”+$.min(10,20));

7、支持方法的连写
所谓连写,即可以对一个jquery对象连续调用各种不同的方法。
例如:
$(”p”).click(function(){alert($(this).html())})
.mouseover(function(){alert(’mouse over event’)})
.each(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]});

8、操作元素的样式
主要包括以下几种方式:
$(”#msg”).css(”background”); //返回元素的背景颜色
$(”#msg”).css(”background”,”#ccc”) //设定元素背景为灰色
$(”#msg”).height(300); $(”#msg”).width(”200″); //设定宽高
$(”#msg”).css({ color: “red”, background: “blue” });//以名值对的形式设定样式
$(”#msg”).addClass(”select”); //为元素增加名称为select的class
$(”#msg”).removeClass(”select”); //删除元素名称为select的class
$(”#msg”).toggleClass(”select”); //如果存在(不存在)就删除(添加)名称为select的class

9、完善的事件处理功能
Jquery已经为我们提供了各种事件处理方法,我们无需在html元素上直接写事件,而可以直接为通过jquery获取的对象添加事件。
如:
$(”#msg”).click(function(){alert(”good”)}) //为元素添加了单击事件
$(”p”).click(function(i){this.style.color=['#f00','#0f0','#00f'][ i ]})
//为三个不同的p元素单击事件分别设定不同的处理
jQuery中几个自定义的事件:
(1)hover(fn1,fn2):一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。
//当鼠标放在表格的某行上时将class置为over,离开时置为out。
$(”tr”).hover(function(){
$(this).addClass(”over”);
},
function(){
$(this).addClass(”out”);
});
(2)ready(fn):当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。
$(document).ready(function(){alert(”Load Success”)})
//页面加载完毕提示“Load Success”,相当于onload事件。与$(fn)等价
(3)toggle(evenFn,oddFn): 每次点击时切换要调用的函数。如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。随后的每次点击都重复对这两个函数的轮番调用。
//每次点击时轮换添加和删除名为selected的class。
$(”p”).toggle(function(){
$(this).addClass(”selected”);
},function(){
$(this).removeClass(”selected”);
});
(4)trigger(eventtype): 在每一个匹配的元素上触发某类事件。
例如:
$(”p”).trigger(”click”); //触发所有p元素的click事件
(5)bind(eventtype,fn),unbind(eventtype): 事件的绑定与反绑定
从每一个匹配的元素中(添加)删除绑定的事件。
例如:
$(”p”).bind(”click”, function(){alert($(this).text());}); //为每个p元素添加单击事件
$(”p”).unbind(); //删除所有p元素上的所有事件
$(”p”).unbind(”click”) //删除所有p元素上的单击事件

10、几个实用特效功能
其中toggle()和slidetoggle()方法提供了状态切换功能。
如toggle()方法包括了hide()和show()方法。
slideToggle()方法包括了slideDown()和slideUp方法。

11、几个有用的jQuery方法
$.browser.浏览器类型:检测浏览器类型。有效参数:safari, opera, msie, mozilla。如检测是否ie:$.browser.isie,是ie浏览器则返回true。
$.each(obj, fn):通用的迭代函数。可用于近似地迭代对象和数组(代替循环)。

$.each( [0,1,2], function(i, n){ alert( “Item #” + i + “: ” + n ); });
等价于:
var tempArr=[0,1,2];
for(var i=0;i alert("Item #"+i+": "+tempArr[ i ]);
}
也可以处理json数据,如
$.each( { name: "John", lang: "JS" }, function(i, n){ alert( "Name: " + i + ", Value: " + n ); });
结果为:
Name:name, Value:John
Name:lang, Value:JS
$.extend(target,prop1,propN):用一个或多个其他对象来扩展一个对象,返回这个被扩展的对象。这是jquery实现的继承方式。
如:
$.extend(settings, options);
//合并settings和options,并将合并结果返回settings中,相当于options继承setting并将继承结果保存在 setting中。
var settings = $.extend({}, defaults, options);
//合并defaults和options,并将合并结果返回到setting中而不覆盖default内容。
可以有多个参数(合并多项并返回)
$.map(array, fn):数组映射。把一个数组中的项目(处理转换后)保存到到另一个新数组中,并返回生成的新数组。
如:
var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
tempArr内容为:[4,5,6]
var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
tempArr内容为:[2,3]
$.merge(arr1,arr2):合并两个数组并删除其中重复的项目。
如:$.merge( [0,1,2], [2,3,4] ) //返回[0,1,2,3,4]
$.trim(str):删除字符串两端的空白字符。
如:$.trim(” hello, how are you? “); //返回”hello,how are you? ”

12、解决自定义方法或其他类库与jQuery的冲突
很多时候我们自己定义了$(id)方法来获取一个元素,或者其他的一些js类库如prototype也都定义了$方法,如果同时把这些内容放在一起就会引起变量方法定义冲突,Jquery对此专门提供了方法用于解决此问题。
使用jquery中的jQuery.noConflict();方法即可把变量$的控制权让渡给第一个实现它的那个库或之前自定义的$方法。之后应用 Jquery的时候只要将所有的$换成jQuery即可,如原来引用对象方法$(”#msg”)改为jQuery(”#msg”)。
如:
jQuery.noConflict();
// 开始使用jQuery
jQuery(”div p”).hide();
// 使用其他库的 $()
$(”content”).style.display = ‘none’;
========================================================================================================
以上资料从网上转载而来,因同事需要提供给同事,现发在这里供大家共享。

]]> http://www.vku8.net/jerry/index.php/2010/04/22/112/feed/ 0 判断客户端是否使用代理服务器及其匿名级别 http://www.vku8.net/jerry/index.php/2010/04/19/110/ http://www.vku8.net/jerry/index.php/2010/04/19/110/#comments Mon, 19 Apr 2010 08:54:07 +0000 jerryshen http://www.vku8.net/jerry/?p=110 要判断客户端是否使用代理服务器,可以从客户端所发送的环境变量信息来判断。
具体来说,就是看HTTP_VIA字段,如果这个字段设置了,说明客户端使用了代理服务器。
匿名级别可以参考下表来判断。
给出一个应用例子,可以挂上代理试试效果: http://ip.mixsec.org/
一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等)
HTTP_X_FORWARDED_FOR = 您的真实 IP
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等)
HTTP_X_FORWARDED_FOR = 代理服务器 IP
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP (补充:这个字段由代理服务器填充,有时会填充网关信息等)
HTTP_X_FORWARDED_FOR = 随机的 IP
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

除此之外,可以通过proxy judges总 结其他一些可供参考的判定信息,一遍于在实践中加以利用。

最后写一个php例子,仅供大家参考:
if(!empty($_SERVER['HTTP_VIA'])) //使用了代理
{
if(!isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
//Anonymous Proxies 普通匿名代理服务器
//代理IP地址为 $_SERVER['REMOTE_ADDR']
}
else
{
//Transparent Proxies 透明代理服务器
//代理IP地址为 $_SERVER['REMOTE_ADDR']
//真实ip地址为 $_SERVER['HTTP_X_FORWARDED_FOR']
}
}
else //没有代理或者是高匿名代理
{
//真实ip地址为 $_SERVER['REMOTE_ADDR']
}

]]>
http://www.vku8.net/jerry/index.php/2010/04/19/110/feed/ 0
数据库设计中的14个技巧 http://www.vku8.net/jerry/index.php/2010/04/16/108/ http://www.vku8.net/jerry/index.php/2010/04/16/108/#comments Fri, 16 Apr 2010 10:27:05 +0000 jerryshen http://www.vku8.net/jerry/?p=108 1. 原始单据与实体之间的关系

  可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单据对应多个实体,或多张原始单据对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

  〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单据对应多个实体”的典型例子。

2. 主键与外键

  一般而言,一个实体不能既无主键又无外键。在E-R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。

  主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

3. 基本表的性质

  基本表与中间表、临时表不同,因为它具有如下四个特性:

  (1) 原子性。基本表中的字段是不可再分解的。

  (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。

  (3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。

  (4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

  理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

4. 范式标准

  基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

  〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

  在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

  表1 商品表的表结构

  商品名称 商品型号 单价 数量 金额

  电视机 29? 2,500 40 100,000

5. 通俗地理解三个范式

  通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

  第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

  第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

  第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

  没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

6. 要善于识别与正确处理多对多的关系

  若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

  〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

7. 主键PK的取值方法

  PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

8. 正确认识数据冗余

  主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

  〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

9. E-R图没有标准答案

  信息系统的E-R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E-R图。尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E-图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

10. 视图技术在数据库设计中很有用

  与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

  对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。只有数据库管理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

11. 中间表、报表和临时表

  中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

12. 完整性约束表现在三个方面

  域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。

  参照完整性:用PK、FK、表级触发器来实现。

  用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

13. 防止数据库设计打补丁的方法是“三少原则”

  (1) 一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E-R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;

  (2) 一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

  (3) 一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有的人就是不习惯、不采纳、不执行。

  数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E-R图,肯定比二百个实体(共二千个属性)的E-R图,要好得多。

  提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E?R图中实体的个数、主键的个数、属性的个数就会越少。

  提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。

  “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

14. 提高数据库运行效率的办法

  在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

  (1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

  (2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。

  (3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。

  (4) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。

  (5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

  总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

]]>
http://www.vku8.net/jerry/index.php/2010/04/16/108/feed/ 0
管理的十个寓言故事 http://www.vku8.net/jerry/index.php/2010/04/13/106/ http://www.vku8.net/jerry/index.php/2010/04/13/106/#comments Tue, 13 Apr 2010 02:41:19 +0000 jerryshen http://www.vku8.net/jerry/?p=106 相信自己是一只雄鹰
  一个人在高山之巅的鹰巢里,抓到了一只幼鹰,他把幼鹰带回家,养在鸡笼里。这只幼鹰和鸡一起啄食、嬉闹和休息。它以为自己是一只鸡。 这只鹰渐渐长大,羽翼丰满了,主人想把它训练成猎鹰,可是由于终日和鸡混在一起,它已经变得和鸡完全一样,根本没有飞的愿望了。 主人试了各种办法,都毫无效果,最后把它带到山顶上,一把将它扔了出去。这只鹰像块石头似的,直掉下去,慌乱之中它拼命地扑打翅膀,就这样,它终于飞了起来! 秘诀1:磨练召唤成功的力量。

  五枚金币
  有个叫阿巴格的人生活在内蒙古草原上。有一次,年少的阿巴格和他爸爸在草原上迷了路,阿巴格又累又怕,到最后快走不动了。爸爸就从兜里掏出5枚硬币,把一枚硬币埋在草地里,把其余4枚放在阿巴格的手上,说:“人生有5枚金币,童年、少年、青年、中年、老年各有一枚,你现在才用了一枚,就是埋在草地里的那一枚,你不能把5枚都扔在草原里,你要一点点地用,每一次都用出不同来,这样才不枉人生一世。今天我们一定要走出草原,你将来也一定要走出草原。世界很大,人活着,就要多走些地方,多看看,不要让你的金币没有用就扔掉。”在父亲的鼓励下,那天阿巴格走出了草原。长大后,阿巴格离开了家乡,成了一名优秀的船长。 秘诀2:珍惜生命,就能走出挫折的沼泽地。

  扫阳光
  有兄弟二人,年龄不过四、五岁,由于卧室的窗户整天都是密闭着,他们认为屋内太阴暗,看见外面灿烂的阳光,觉得十分羡慕。兄弟俩就商量说:“我们可以一起把外面的阳光扫一点进来。”于是,兄弟两人拿着扫帚和畚箕,到阳台上去扫阳光。 等到他们把畚箕搬到房间里的时候,里面的阳光就没有了。这样一而再再而三地扫了许多次,屋内还是一点阳光都没有。正在厨房忙碌的妈妈看见他们奇怪的举动,问道:“你们在做什么?”他们回答说:“房间太暗了,我们要扫点阳光进来。”妈妈笑道:“只要把窗户打开,阳光自然会进来,何必去扫呢?” 秘诀3:把封闭的心门敞开,成功的阳光就能驱散失败的阴暗。

  一只蜘蛛和三个人
  雨后,一只蜘蛛艰难地向墙上已经支离破碎的网爬去,由于墙壁潮湿,它爬到一定的高度,就会掉下来,它一次次地向上爬,一次次地又掉下来…… 第一个人看到了,他叹了一口气,自言自语:“我的一生不正如这只蜘蛛吗?忙忙碌碌而无所得。”于是,他日渐消沉。 第二个人看到了,他说:这只蜘蛛真愚蠢,为什么不从旁边干燥的地方绕一下爬上去?我以后可不能像它那样愚蠢。于是,他变得聪明起来。 第三个人看到了,他立刻被蜘蛛屡败屡战的精神感动了。于是,他变得坚强起来。 秘诀4:有成功心态者处处都能发觉成功的力量。

  自己救自己
  某人在屋檐下躲雨,看见观音正撑伞走过。这人说:“观音菩萨,普度一下众生吧,带我一段如何?” 观音说:“我在雨里,你在檐下,而檐下无雨,你不需要我度。”这人立刻跳出檐下,站在雨中:“现在我也在雨中了,该度我了吧?”观音说:“你在雨中,我也在雨中,我不被淋,因为有伞;你被雨淋,因为无伞。所以不是我度自己,而是伞度我。你要想度,不必找我,请自找伞去!”说完便走了。 第二天,这人遇到了难事,便去寺庙里求观音。走进庙里,才发现观音的像前也有一个人在拜,那个人长得和观音一模一样,丝毫不差。 这人问:“你是观音吗?” 那人答道:“我正是观音。” 这人又问:“那你为何还拜自己?” 观音笑道:“我也遇到了难事,但我知道,求人不如求己。” 秘诀5:成功者自救。

  让失去变得可爱
  一个老人在高速行驶的火车上,不小心把刚买的新鞋从窗口掉了一只,周围的人倍感惋惜,不料老人立即把第二只鞋也从窗口扔了下去。这举动更让人大吃一惊。老人解释说:“这一只鞋无论多么昂贵,对我而言已经没有用了,如果有谁能捡到一双鞋子,说不定他还能穿呢!” 秘诀6:成功者善于放弃,善于从损失中看到价值。

  请不要开错窗
  一个小女孩趴在窗台上,看窗外的人正埋葬她心爱的小狗,不禁泪流满面,悲恸不已。她的外祖父见状,连忙引她到另一个窗口,让她欣赏他的玫瑰花园。果然小女孩的心情顿时明朗。老人托起外孙女的下巴说:“孩子,你开错了窗户。” 秘诀7:打开失败旁边的窗户,也许你就看到了希望。

  人生的秘诀
  30年前,一个年轻人离开故乡,开始创造自己的前途。他动身的第一站,是去拜访本族的族长,请求指点。老族长正在练字,他听说本族有位后辈开始踏上人生的旅途,就写了3个字:不要怕。然后抬起头来,望着年轻人说:“孩子,人生的秘诀只有6个字,今天先告诉你3个,供你半生受用。” 30年后,这个从前的年轻人已是人到中年,有了一些成就,也添了很多伤心事。归程漫漫,到了家乡,他又去拜访那位族长。他到了族长家里,才知道老人家几年前已经去世,家人取出一个密封的信封对他说: “这是族长生前留给你的,他说有一天你会再来。”还乡的游子这才想起来,30年前他在这里听到人生的一半秘诀,拆开信封,里面赫然又是3个大字:不要悔。 秘诀8:中年以前不要怕,中年以后不要悔。

  司机考试
  某大公司准备以高薪雇用一名小车司机,经过层层筛选和考试之后,只剩下三名技术最优良的竞争者。主考者问他们:“悬崖边有块金子,你们开着车去拿,觉得能距离悬崖多近而又不至于掉落呢?” “二公尺。”第一位说。 “半公尺。”第二位很有把握地说。 “我会尽量远离悬崖,愈远愈好。”第三位说。 结果这家公司录取了第三位。 秘诀9:不要和诱惑较劲,而应离得越远越好。

  狮子和羚羊的家教
  每天,当太阳升起来的时候,非洲大草原上的动物们就开始奔跑了。 狮子妈妈在教育自己的孩子:“孩子,你必须跑得再快一点,再快一点,你要是跑不过最慢的羚羊,你就会活活地饿死。” 在另外一个场地上,羚羊妈妈也在教育自己的孩子:“孩子,你必须跑得再快一点,再快一点,如果你不能比跑得最快的狮子还要快,那你就肯定会被他们吃掉。” 秘诀10:记住你跑得快,别人跑得更快。

]]>
http://www.vku8.net/jerry/index.php/2010/04/13/106/feed/ 0
php效率高写法 http://www.vku8.net/jerry/index.php/2010/04/13/104/ http://www.vku8.net/jerry/index.php/2010/04/13/104/#comments Tue, 13 Apr 2010 02:31:26 +0000 jerryshen http://www.vku8.net/jerry/?p=104 1、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
2、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
3、$row[’id’] 的速度是$row[id]的7倍。
4、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
5、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
6、注销那些不用的变量尤其是大数组,以便释放内存。
7、尽量避免使用__get,__set,__autoload。
8、require_once()代价昂贵。
9、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
10、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
11、函数代替正则表达式完成相同功能。
12、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
13、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
14、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
15、用@屏蔽错误消息的做法非常低效,极其低效。
16、打开apache的mod_deflate模块,可以提高网页的浏览速度。
17、数据库连接当使用完毕时应关掉,不要用长连接。
18、错误消息代价昂贵。
19、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
20、递增一个全局变量要比递增一个局部变量慢2倍。
21、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
22、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
23、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
24、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添? ……

]]>
http://www.vku8.net/jerry/index.php/2010/04/13/104/feed/ 0
*nux系统top与vmstat命令解析 http://www.vku8.net/jerry/index.php/2010/02/22/102/ http://www.vku8.net/jerry/index.php/2010/02/22/102/#comments Mon, 22 Feb 2010 02:19:59 +0000 jerryshen http://www.vku8.net/jerry/?p=102 说cpu可以从top中来理解,第一行中load averages代表着运行和等待任务综合取时间的百分比
从以上大家经常误以为都是等待任务的总和时间
在对于很多人应用上得出的结论,load值不应该高于3,如果cpu为2个则不应该高于6
当这个值过大时候,应该先分析linux中内核配置最大线程数是否正确。
在*nix中,没有改过的内核最大能使用51200个线程。linux(redhat)下是/etc/sysctl.conf
而下面行中,对于us sy ni id参数也很重要
us代表 init分配出来的用户进程占用cpu性能百分比
sy代表 系统自身调用占用cpu百分比(例如对于写入硬盘,是设备对于数据包的io写入)
ni代表 用户进程空间内改变过优先级的进程占用cpu百分比
id代表 系统cpu空闲
wa代表 所有进程被阻塞等待完成一次io占用id百分比
还有对于多个cpu查看大多数linux可以在top中点击 数字1开展开查看 若不支持该命令可以使用mpstat -P ALL来查看cpu个数及内核版本
在性能测试中并发情况很多,需要使用vmstat关注
关注1:r 等待运行的进程数
关注2:in(system) 每秒的内核中断次数
关注3:cs(system) 每秒的上下文切换线程次数
r在并发时候应当很稳定为好,至于多少需要根据应用,没有是最好的理想。
对于in和cs在并发时候会很高,原因是内核正在不停的并发处理。需要记录便于以后优化做说明
需要注意当id(cpu)中是否长时间为0 r也很高上10位数字,这时我建议应该查看程序在并发处理时,是否导致cpu调度出现异常处理。
对于内核调度说明,可以让你更好理解in和cs
当系统做上下文切换时,cpu保存所有进程的正文信息并获得新进程的所有正文内容
正文信息包括大量的linux追踪每个进程信息,尤其是一些资源:那些进程正在执行,被分配了哪些内存,
它打开了那些文件,等等。切换正文会触发大量的信息移动,这是比较高的开销,如果可能的话尽量保持很小的上下文切换。
为了尽可能的减小上下文切换,你首先需要知道它们是怎么产生的。
首先,内核调度触发上下文切换.为了保证每个进程平等的共享cpu时间,内核周期性中断的进程,
如果合适,内核调度器会开始一个其他的进程而不是让当前的进程继续执行,每次的周期性中断或者定时中断都可能触发上下文切换,
每秒定时中断的次数因不同架构和不同的内核版本而不同

]]>
http://www.vku8.net/jerry/index.php/2010/02/22/102/feed/ 0
人类无法抗拒的10种心理 http://www.vku8.net/jerry/index.php/2010/02/22/100/ http://www.vku8.net/jerry/index.php/2010/02/22/100/#comments Mon, 22 Feb 2010 02:03:06 +0000 jerryshen http://www.vku8.net/jerry/?p=100 1、鸟笼逻辑   

挂一个漂亮的鸟笼在房间里最显眼的地方,过不了几天,主人一定会做出下面两个选择之一:把鸟笼扔掉,或者买一只鸟回来放在鸟笼里。这就是鸟笼逻辑。过程很简单,设想你是这房间的主人,只要有人走进房间,看到鸟笼,就会忍不住问你:“鸟呢?是不是死了?”当你回答:“我从来都没有养过鸟。”人们会问: “那么,你要一个鸟笼干什么?”最后你不得不在两个选择中二选一,因为这比无休止的解释要容易得多。鸟笼逻辑的原因很简单:人们绝大部分的时候是采取惯性思维。所以可见在生活和工作中培养逻辑思维是多么重要。

2、破窗效应   

心理学的研究上有个现象叫做“破窗效应”,就是说,一个房子如果窗户破了,没有人去修补,隔不久,其它的窗户也会莫名其妙的被人打破;一面墙,如果出现一些涂鸦没有清洗掉,很快的,墙上就布满了乱七八糟,不堪入目的东西。一个很干净的地方,人会不好意思丢垃圾,但是一旦地上有垃圾出现之后,人就会毫不犹疑的?,丝毫不觉羞愧。这真是很奇怪的现象。   

心理学家研究的就是这个“引爆点”,地上究竟要有多脏, 人们才会觉得反正这么脏,再脏一点无所谓,情况究竟要坏到什么程度,人们才会自暴自弃,让它烂到底。   

任何坏事,如果在开始时没有阻拦掉,形成风气,改也改不掉,就好象河堤,一个小缺口没有及时修补,可以崩坝,造成千百万倍的损失。   

犯罪其实就是失序的结果,纽约市在80年代的时候,真是无处不抢,无日不杀,大白天走在马路上也会害怕。地铁更不用说了,车厢脏乱,到处涂满了秽句,坐在地铁里,人人自危。我虽然没有被抢过,但是有位教授被人在光天化日之下,敲了一记闷棍,眼睛失明,从此结束他的研究生涯,使我多少年来谈虎变色,不敢只身去纽约开会。最近纽约的市容和市誉提升了不少,令我颇为吃惊,一个已经向下沉沦的城市,竟能死而复生,向上提升。   

因此,当我出去开会,碰到一位犯罪学家时,立刻向他讨教,原来纽约市用的就是过去书本上讲的破窗效应的理论,先改善犯罪的环境,使人们不易犯罪, 再慢慢缉凶捕盗,回归秩序。   

当时这个做法虽然被人骂为缓不济急,“船都要沉了还在洗甲板”,但是纽约市还是从维护地铁车厢干净着手,并将不买车票白搭车的人用手铐铐住排成一列站在月台上,公开向民众宣示政府整顿的决心,结果发现非常有效。   警察发现人们果然比较不会在干净的场合犯罪,又发现抓逃票很有收获,因为每七名逃票的人中就有一名是通缉犯,二十名中就有一名携带武器,因此警察愿意很认真地去抓逃票,这使得歹徒不敢逃票,出门不敢带武器,以免得不偿失、因小失大。这样纽约市就从最小、最容易的地方着手,打破了犯罪环结 (chain),使这个恶性循环无法继续下去。

3、责任分散效应   

1964年3月13日夜3时20分,在美国纽约郊外某公寓前,一位叫朱诺比白的年轻女子在结束酒巴间工作回家的路上遇刺。当她绝望地喊叫:“有人要杀人啦!救命!救命!”听到喊叫声,附近住户亮起了灯,打开了窗户,凶手吓跑了。当一切恢复平静后,凶手又返回作案。当她又叫喊时,附近的住户又打开了电灯,凶手又逃跑了。当她认为已经无事,回到自己家上楼时,凶手又一次出现在她面前,将她杀死在楼梯上。在这个过程中,尽管她大声呼救,她的邻居中至少有 38位到窗前观看,但无一人来救她,甚至无一人打电话报警。这件事引起纽约社会的轰动,也引起了社会心理学工作者的重视和思考。人们把这种众多的旁观者见死不救的现象称为责任分散效应。   

对于责任分散效应形成的原因,心理学家进行了大量的实验和调查,结果发现:这种现象不能仅仅说是众人的冷酷无情,或道德日益沦丧的表现。因为在不同的场合,人们的援助行为确实是不同的。当一个人遇到紧急情境时,如果只有他一个人能提供帮助,他会清醒地意识到自己的责任,对受难者给予帮助。如果他见死不救会产生罪恶感、内疚感,这需要付出很高的心理代价。而如果有许多人在场的话,帮助求助者的责任就由大家来分担,造成责任分散,每个人分担的责任很少,旁观者甚至可能连他自己的那一份责任也意识不到,从而产生一种“我不去救,由别人去救”的心理,造成“集体冷漠”的局面。如何打破这种局面,这是心理学家正在研究的一个重要课题。

4、帕金森定律   

英国著名历史学家诺斯古德?帕金森通过长期调查研究,写出一本名叫《帕金森定律》的书。他在书中阐述了机构人员膨胀的原因及后果:一个不称职的官员,可能有三条出路,第一是申请退职,把位子让给能干的人;第二是让一位能干的人来协助自己工作;第三是任用两个水平比自己更低的人当助手。这第一条路是万万走不得的,因为那样会丧失许多权利;第二条路也不能走,因为那个能干的人会成为自己的对手;看来只有第三条路最适宜。于是,两个平庸的助手分担了他的工作,他自己则高高在上发号施令,他们不会对自己的权利构成威胁。两个助手既然无能,他们就上行下效,再为自己找两个更加无能的助手。如此类推,就形成了一个机构臃肿,人浮于事,相互扯皮,效率低下的领导体系。

5、晕轮效应   

俄国著名的大文豪普希金曾因晕轮效应的作用吃了大苦头。他狂热地爱上了被称为“莫斯科第一美人”的娜坦丽,并且和她结了婚。娜坦丽容貌惊人,但与普希金志不同道不合。当普希金每次把写好的诗读给她听时。她总是捂着耳朵说:“不要听!不要听!”相反,她总是要普希金陪她游乐,出席一些豪华的晚会、舞会,普希金为此丢下创作,弄得债台高筑,最后还为她决斗而死,使一颗文学巨星过早地陨落。在普希金看来,一个漂亮的女人也必然有非凡的智慧和高贵的品格,然而事实并非如此,这种现象被称为晕轮效应。   

所谓晕轮效应,就是在人际交往中,人身上表现出的某一方面的特征,掩盖了其他特征,从而造成人际认知的障碍。在日常生活中,“晕轮效应”往往在悄悄地影响着我们对别人的认知和评价。比如有的老年人对青年人的个别缺点,或衣着打扮、生活习惯看不顺眼,就认为他们一定没出息;有的青年人由于倾慕朋友的某一可爱之处,就会把他看得处处可爱,真所谓“一俊遮百丑”。晕轮效应是一种以偏概全的主观心理臆测,其错误在于:第一,它容易抓住事物的个别特征,习惯以个别推及一般,就像盲人摸象一样,以点代面;第二,它把并无内在联系的一些个性或外貌特征联系在一起,断言有这种特征必然会有另一种特征;第三,它说好就全都肯定,说坏就全部否定,这是一种受主观偏见支配的绝对化倾向。总之,晕轮效应是人际交往中对人的心理影响很大的认知障碍,我们在交往中要尽量地避免和克服晕轮效应的副作用。

6、霍桑效应(Hawthorne effect)   

心理学上的一种实验者效应。20世纪20-30年代,美国研究人员在芝加哥西方电力公司霍桑工厂进行的工作条件、社会因素和生产效益关系实验中发现了实验者效应,称霍桑效应。   

实验的第一阶段是从1924年11月开始的工作条件和生产效益的关系,设为实验组和控制组。结果不管增加或控制照明度,实验组产量都上升,而且照明度不变的控制组产量也增加。另外,有试验了工资报酬、工间休息时间、每日工作长度和每周工作天数等因素,也看不出这些工作条件对生产效益有何直接影响。第二阶段的试验是由美国哈佛大学教授梅奥领导的,着重研究社会因素与生产效率的关系,结果发现生产效率的提高主要是由于被实验者在精神方面发生了巨大的变化。参加试验的工人被置于专门的实验室并由研究人员领导,其社会状况发生了变化,受到各方面的关注,从而形成了参与试验的感觉,觉得自己是公司中重要的一部分,从而使工人从社会角度方面被激励,促进产量上升。   这个效应告诉我们,当同学或自己受到公众的关注或注视时,学习和交往的效率就会大大增加。因此,我们在日常生活中要学会与他人友好相处,明白什么样的行为才是同学和老师所接受和赞赏的,我们只有在生活和学习中不断地增加自己的良好行为,才可能受到更多人的关注和赞赏,也才可能让我们的学习不断进步,充满自信!

7、习得性无助实验   

习得性无助效应最早有奥弗米尔和西里格曼发现,后来在动物和人类研究中被广泛探讨。简单地说,很多实验表明,经过训练,狗可以越过屏障或从事其他的行为来逃避实验者加于它的电击。但是,如果狗以前受到不可预期(不知道什么时候到来)且不可控制的电击(如电击的中断与否不依赖于狗的行为),当狗后来有机会逃离电击时,他们也变得无力逃离。而且,狗还表现出其他方面的缺陷,如感到沮丧和压抑,主动性降低等等。   

狗之所以表现出这种状况,是由于在实验的早期学到了一种无助感。也就是说,它们认识到自己无论做什么都不能控制电击的终止。在每次实验中,电击终止都是在实验者掌控之下的,而狗会认识到自己没有能力改变这种外界的控制,从而学到了一种无助感。   

人如果产生了习得性无助,就成为了一种深深的绝望和悲哀。因此,我们在学习和生活中应把自己的眼光在开阔一点,看到事件背后的真正的决定因素,不要使我们自己陷入绝望。

8、证人的记忆   

证人,在我们的认识里,通常都是提供一些客观的证据的人,就是把自己亲眼看到、亲耳听到的东西如实地讲出来的人。然而,心理学研究证明,很多证人提供的证词都不太准确,或者说是具有个人倾向性,带着个人的观点和意识。   

证人对他们的证词的信心并不能决定他们证词的准确性,这一研究结果令人感到惊讶。心理学家珀费可特和豪林斯决定对这一结论进行更深入的研究。为了考察证人的证词是否有特别的东西,他们将证人的记忆与对一般知识的记忆进行了比较。   

他们让被试看一个简短的录象,是关于一个女孩被绑架的案件。第二天,让被试回答一些有关录象里内容的问题,并要求他们说出对自己回答的信心程度,然后做再认记忆测验。接下来,使用同样的方法,内容是从百科全书和通俗读物中选出的一般知识问题。   

和以前发生的一样,珀费可特和豪林斯也发现,在证人回忆的精确性上,那些对自己的回答信心十足的人实际上并不比那些没信心的人更高明,但对于一般知识来说,情况就不是这样,信心高的人回忆成绩比信心不足的人好得多。   

人们对于自己在一般知识上的优势与弱势有自知之明。因此,倾向于修改他们对于信心量表的测验结果。一般知识是一个数据库,在个体之间是共享的,它有公认的正确答案,被试可以自己去衡量。例如,人们会知道自己在体育问题上是否比别人更好或更差一点。但是,目击的事件不受这种自知之明的影响。例如,从总体上讲,他们不大可能知道自己比别人在记忆事件中的参与者头发颜色方面更好或更差。  

9、罗森塔尔效应   

美国心理学家罗森塔尔等人于1968年做过一个著名实验。他们到一所小学,在一至六年级各选三个班的儿童进行煞有介事的“预测未来发展的测验”,然后实验者将认为有“优异发展可能”的学生名单通知教师。其实,这个名单并不是根据测验结果确定的,而是随机抽取的。它是以“权威性的谎言”暗示教师,从而调动了教师对名单上的学生的某种期待心理。8个月后,再次智能测验的结果发现,名单上的学生的成绩普遍提高,教师也给了他们良好的品行评语。这个实验取得了奇迹般的效果,人们把这种通过教师对学生心理的潜移默化的影响,从而使学生取得教师所期望的进步的现象,称为“罗森塔尔效应”,习惯上也称为皮格马利翁效应(皮格马利翁是古希腊神话中塞浦路斯国王,他对一尊少女塑像产生爱慕之情,他的热望最终使这尊雕像变为一个真人,两人相爱结合)。   

教育实践也表明:如果教师喜爱某些学生,对他们会抱有较高期望,经过一段时间,学生感受到教师的关怀、爱护和鼓励;常常以积极态度对待老师、对待学习以及对待自己的行为,学生更加自尊、自信、自爱、自强,诱发出一种积极向上的激情,这些学生常常会取得老师所期望的进步。相反,那些受到老师忽视、歧视的学生,久而久之会从教师的言谈、举止、表情中感受到教师的“偏心”,也会以消极的态度对待老师、对待自己的学习,不理会或拒绝听从老师的要求;这些学生常常会一天天变坏,最后沦为社会的不良分子。尽管有些例外,但大趋势却是如此,同时这也给教师敲响了警钟。

10、虚假同感偏差(false consensus bias)   

我们通常都会相信,我们的爱好与大多数人是一样的。如果你喜欢玩电脑游戏,那么就有可能高估喜欢电脑游戏的人数。你也通常会高估给自己喜欢的同学投票的人数,高估自己在群体中的威信与领导能力等等。你的这种高估与你的行为及态度有相同特点的人数的倾向性就叫做“虚假同感偏差”。有些因素会影响你的这种虚假同感偏差强度:
(1)当外部的归因强于内部归因时;

(2)当前的行为或事件对某人非常重要时;

(3)当你对自己的观点非常确定或坚信时;

(4)当你的地位或正常生活和学习受到某种威胁时;

(5)当涉及到某种积极的品质或个性时;

(6)当你将其他人看成与自己是相似时。

]]>
http://www.vku8.net/jerry/index.php/2010/02/22/100/feed/ 0