简略语句
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 网站内容管理系统 官方网站
]]>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的方法,如要获取第三个
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
}
也可以处理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’;
========================================================================================================
以上资料从网上转载而来,因同事需要提供给同事,现发在这里供大家共享。
二、使用透明代理服务器的情况: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']
}
可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单据对应多个实体,或多张原始单据对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。
〖例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语言进行程序设计时,尽量采取优化算法。
总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。
]]> 五枚金币
有个叫阿巴格的人生活在内蒙古草原上。有一次,年少的阿巴格和他爸爸在草原上迷了路,阿巴格又累又怕,到最后快走不动了。爸爸就从兜里掏出5枚硬币,把一枚硬币埋在草地里,把其余4枚放在阿巴格的手上,说:“人生有5枚金币,童年、少年、青年、中年、老年各有一枚,你现在才用了一枚,就是埋在草地里的那一枚,你不能把5枚都扔在草原里,你要一点点地用,每一次都用出不同来,这样才不枉人生一世。今天我们一定要走出草原,你将来也一定要走出草原。世界很大,人活着,就要多走些地方,多看看,不要让你的金币没有用就扔掉。”在父亲的鼓励下,那天阿巴格走出了草原。长大后,阿巴格离开了家乡,成了一名优秀的船长。 秘诀2:珍惜生命,就能走出挫折的沼泽地。
扫阳光
有兄弟二人,年龄不过四、五岁,由于卧室的窗户整天都是密闭着,他们认为屋内太阴暗,看见外面灿烂的阳光,觉得十分羡慕。兄弟俩就商量说:“我们可以一起把外面的阳光扫一点进来。”于是,兄弟两人拿着扫帚和畚箕,到阳台上去扫阳光。 等到他们把畚箕搬到房间里的时候,里面的阳光就没有了。这样一而再再而三地扫了许多次,屋内还是一点阳光都没有。正在厨房忙碌的妈妈看见他们奇怪的举动,问道:“你们在做什么?”他们回答说:“房间太暗了,我们要扫点阳光进来。”妈妈笑道:“只要把窗户打开,阳光自然会进来,何必去扫呢?” 秘诀3:把封闭的心门敞开,成功的阳光就能驱散失败的阴暗。
一只蜘蛛和三个人
雨后,一只蜘蛛艰难地向墙上已经支离破碎的网爬去,由于墙壁潮湿,它爬到一定的高度,就会掉下来,它一次次地向上爬,一次次地又掉下来…… 第一个人看到了,他叹了一口气,自言自语:“我的一生不正如这只蜘蛛吗?忙忙碌碌而无所得。”于是,他日渐消沉。 第二个人看到了,他说:这只蜘蛛真愚蠢,为什么不从旁边干燥的地方绕一下爬上去?我以后可不能像它那样愚蠢。于是,他变得聪明起来。 第三个人看到了,他立刻被蜘蛛屡败屡战的精神感动了。于是,他变得坚强起来。 秘诀4:有成功心态者处处都能发觉成功的力量。
自己救自己
某人在屋檐下躲雨,看见观音正撑伞走过。这人说:“观音菩萨,普度一下众生吧,带我一段如何?” 观音说:“我在雨里,你在檐下,而檐下无雨,你不需要我度。”这人立刻跳出檐下,站在雨中:“现在我也在雨中了,该度我了吧?”观音说:“你在雨中,我也在雨中,我不被淋,因为有伞;你被雨淋,因为无伞。所以不是我度自己,而是伞度我。你要想度,不必找我,请自找伞去!”说完便走了。 第二天,这人遇到了难事,便去寺庙里求观音。走进庙里,才发现观音的像前也有一个人在拜,那个人长得和观音一模一样,丝毫不差。 这人问:“你是观音吗?” 那人答道:“我正是观音。” 这人又问:“那你为何还拜自己?” 观音笑道:“我也遇到了难事,但我知道,求人不如求己。” 秘诀5:成功者自救。
让失去变得可爱
一个老人在高速行驶的火车上,不小心把刚买的新鞋从窗口掉了一只,周围的人倍感惋惜,不料老人立即把第二只鞋也从窗口扔了下去。这举动更让人大吃一惊。老人解释说:“这一只鞋无论多么昂贵,对我而言已经没有用了,如果有谁能捡到一双鞋子,说不定他还能穿呢!” 秘诀6:成功者善于放弃,善于从损失中看到价值。
请不要开错窗
一个小女孩趴在窗台上,看窗外的人正埋葬她心爱的小狗,不禁泪流满面,悲恸不已。她的外祖父见状,连忙引她到另一个窗口,让她欣赏他的玫瑰花园。果然小女孩的心情顿时明朗。老人托起外孙女的下巴说:“孩子,你开错了窗户。” 秘诀7:打开失败旁边的窗户,也许你就看到了希望。
人生的秘诀
30年前,一个年轻人离开故乡,开始创造自己的前途。他动身的第一站,是去拜访本族的族长,请求指点。老族长正在练字,他听说本族有位后辈开始踏上人生的旅途,就写了3个字:不要怕。然后抬起头来,望着年轻人说:“孩子,人生的秘诀只有6个字,今天先告诉你3个,供你半生受用。” 30年后,这个从前的年轻人已是人到中年,有了一些成就,也添了很多伤心事。归程漫漫,到了家乡,他又去拜访那位族长。他到了族长家里,才知道老人家几年前已经去世,家人取出一个密封的信封对他说: “这是族长生前留给你的,他说有一天你会再来。”还乡的游子这才想起来,30年前他在这里听到人生的一半秘诀,拆开信封,里面赫然又是3个大字:不要悔。 秘诀8:中年以前不要怕,中年以后不要悔。
司机考试
某大公司准备以高薪雇用一名小车司机,经过层层筛选和考试之后,只剩下三名技术最优良的竞争者。主考者问他们:“悬崖边有块金子,你们开着车去拿,觉得能距离悬崖多近而又不至于掉落呢?” “二公尺。”第一位说。 “半公尺。”第二位很有把握地说。 “我会尽量远离悬崖,愈远愈好。”第三位说。 结果这家公司录取了第三位。 秘诀9:不要和诱惑较劲,而应离得越远越好。
狮子和羚羊的家教
每天,当太阳升起来的时候,非洲大草原上的动物们就开始奔跑了。 狮子妈妈在教育自己的孩子:“孩子,你必须跑得再快一点,再快一点,你要是跑不过最慢的羚羊,你就会活活地饿死。” 在另外一个场地上,羚羊妈妈也在教育自己的孩子:“孩子,你必须跑得再快一点,再快一点,如果你不能比跑得最快的狮子还要快,那你就肯定会被他们吃掉。” 秘诀10:记住你跑得快,别人跑得更快。
挂一个漂亮的鸟笼在房间里最显眼的地方,过不了几天,主人一定会做出下面两个选择之一:把鸟笼扔掉,或者买一只鸟回来放在鸟笼里。这就是鸟笼逻辑。过程很简单,设想你是这房间的主人,只要有人走进房间,看到鸟笼,就会忍不住问你:“鸟呢?是不是死了?”当你回答:“我从来都没有养过鸟。”人们会问: “那么,你要一个鸟笼干什么?”最后你不得不在两个选择中二选一,因为这比无休止的解释要容易得多。鸟笼逻辑的原因很简单:人们绝大部分的时候是采取惯性思维。所以可见在生活和工作中培养逻辑思维是多么重要。
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)当你将其他人看成与自己是相似时。
]]>