关于ORM的补遗
2008/02/23 12:47 | by edwardproAdmin ]
现在看来ORM的好处不仅是使用方便,更多的是你会对数据表的设计和范式有一个非常深刻的认识,因为在ORM下是不允许错误的数据库范式设计的,我个人体验下来,在ORM下使用,必须达到第二范式标准,如果想完全使用必须达到第三范式,更高的范式现在来看毫无必要,但在以rails为代表的orm中会出现范式越高效率越高的情况,原因就在于他对表的操作很好的把握了delay这个概念,但传统的sql希望是最简单的方法一次取得数据,所以很多老程序员对于范式均会以越低越好著称,因为在他们的理解数据表越冗余,则sql越好些,则查询效率越高,但带来的负面就是数据的不统一和系统扩展维护的复杂度,因此在这个层面上ORM是有意义的,而且绝对应该得到推荐的。
至于效率,昨天在javaeye上看到一个讨论php orm的文章,大多数人都痛骂了php下的orm实现,其实我现在的方案效率也不高,但我觉得在后台上使用尚能接受,而且在代码上确实非常干净这一点正是我想要的东西,现在对于写程序来说,数据库操作变成了配置这是一种享受,这两天应该是心情很愉悦的两天虽然,其实我设计的表由于是标准三范式查询语句极为复杂,但现在却轻松许多,感谢orm这种概念,相信在机器性能大幅提高之后依靠硬件和使用未来的对象数据库之后,orm一定能得到更多的应用。
貌似恢复了
2008/02/21 06:22 | by edwardproAdmin ]
我的ORM实现思路介绍
2008/02/21 05:49 | by edwardproAdmin ]
在数据库操作中有两类SELECT,单表和多表,对于ORM对象来说多表总是非常复杂的,总结起来,表与表的关系有那么几种:
1对多
多对1
多对多
1对1
而将它们整合之后只有两种:
1对多
1对1
其中多对多变成了双向一对多(但在我的实现中使用了另外一种思路,后面会讲到,这种思路极大的简化了表的关系)而多对一本身来说就是1对多,只是主控方向不同而已,而且多对1实际上存在很少基本是在多对多中出现,因此基本可以忽略。
好了,下面来说说我对这两种模式的处理,实际上我采用了一种更简单的思维去考虑:
无论如何查询最终将返回一个hashmap(这应该是php的最佳形式,java中一个朋友曾经和我争论过这个,他认为Bean+list好过Hashmap+list,我个人的连接池均采用了hashmap+list,因为我想从根本上去摒弃java在类型上的不灵活,这是另外一个话题不到讨论),好了回到现在话题,那么经过我的乱七八糟的实验之后我只得出了两种结果,无论是哪种表关系,只有同时加载和延后加载两种风格。一种是单一数组比如
array(
"0"=>array(1,a,b),
"1"=>array(2,b,c)
)
另外一种模式是:
array(
"0"=>array(1,a,'extend'=>array(c,1,b))
)
实际上在实际的查询中前者我认为是LEFT JOIN语句,后者是一种我自己叫做后加载模式也就是select × from a select × from b where id in a。
而实际上我一开始去过于分析表和表的关系的时候其实是非常死胡同的,导致逻辑代码非常复杂,但却最后不知道怎么去写sql,而现在彻底摒弃了表和表的关系代以语句的实现来判断如何实现,这在很大程度上彻底简化了代码。当然我这种代码在本质上有很多致命弱点——查询语句会偏多带来的直接问题就是效率偏低,这个问题要在以后不断摸索和对数据库的熟悉之后再解决。
下面来看看部分实现代码:
module的构造,他需要塞入的参数1 连接池对象 表名 field列表,这个是可选的
function Module($dbObj,$dbName,$fieldList=array()){
$this->connectObj=$dbObj;
$this->dbname=$dbName;
$this->fieldList=$fieldList;
}
查询的类:其中核心的部分就是getsqlstr和后面的processonemore,processonemore就是我说的延迟加载查询的函数
function query($where="",$group="",$limit="",$order="",$foriegn="",$lazy=1,$fields='*'){
$sql=$this->getSqlStr($fields,$where,$group,$limit,$order,$foriegn);
$this->connectObj->sql=$sql;
$result = $this->connectObj->doSqlArray();
if($lazy){
$this->processOneMore(&$result);
}
return $result;
}
单一表查询:
private function processOneToOne(){
$ret="";
foreach($this->foriegnDb as $v){
if($v['type']==1){
$dbName=$v['db'];
$fKey=$v['key'];
$ret.=" LEFT OUTER JOIN {$this->connectObj->tablePrefix}{$dbName} ON {$this->connectObj->tablePrefix}{$dbName}.{$fKey}={$this->connectObj->tablePrefix}{$this->dbname}.{$this->key}";
}
}
return $ret;
}
多表查询:
private function processOneMore(&$result){
foreach ($this->foriegnDb as $v){
//ont to more
if($v['type']==2){
$className=$v['class'];
$dbName=$v['db'];
$key=$v['key'];
require_once(MODULE_ROOT.'/module.'.$className.'.php');
if(class_exists($className)){
$mObj=new $className();
foreach ($result as $k=>$v){
$cKey=$v[$this->key];
$r = $mObj->query("{$this->connectObj->tablePrefix}{$dbName}.{$key} = '{$cKey}'");
$result[$k]['extTable']=$r;
}
}
}
}
}
好,现在这样就基本实现了orm最基本的复合查询,不过现在的orm版本在sql上还比较单一,需要更多的sql优化,对类的处理进行大面积的优化才能有工业级性能,有时间的时候继续研究,这次其实参考了比较多的cakephp的思维方式,感觉还是不错的。
还有一个重要的问题:sql查询没有进行缓冲设计,这部分我打算是要用aop化的方面编程的方式来实现,具体的实施方法还没有想好囧,哪位有这种尝试的可以给我留言哈。
今天是一个值得纪念的日子
2008/02/20 22:32 | by edwardproAdmin ]
一直梦想着用自己的代码实现ORM,今天终于调试成功了,隶属于RAILS IN PHP的重要组件,虽然因此项目进度再次被拖延,又被批了,但相对于那些自己的ORM总是更有吸引力的,今天是值得纪念的一天。
就因为没有重载
2008/02/18 20:10 | by edwardproAdmin ]
abstract class father{
function father($a){
echo "class father";
}
}
class child extends father{
//子类构造函数(这是我错误的一个地方,但它导致了php另外一个错误)
function child(){
echo "test";
}
}
//run
$obj = new child('a');
执行后会发现父类的构造函数根本没有执行!但子类的构造由于参数不对也没有执行。
这个问题很明显:当我在子类中定义了构造函数,按照覆盖原理应该覆盖掉父类的一个构造函数,但是上述情况下由于已经定义了一个非默认参数的构造,这样子类定义的构造自动变成了重载而不是覆盖。而PHP又是不支持重载的,但这个时候应该报错,但神奇的事情发生了,PHP居然执行了,但是他显然没有执行我定义的父类的构造,而是执行了一个默认构造。这是其实产生了无法预知的错误,但PHP却莫名没有报错误,这应该是一个PHP的BUG。
我提交了一个bug report到php.net: http://bugs.php.net/44149
要减肥呀
2008/02/17 20:26 | by edwardproAdmin ]
要减肥了,不减的话,春天到了就露馅了。
定一个短期目标吧,一个月10斤吧,方法:
1 每隔一周做一次为期5天的苹果减肥法,什么都不吃,只吃苹果和少量流质
2 每周保持两次1小时的运动
3 每天保持20分钟的晨锻,看看效果,效果不好只能继续加量
zend studio 6的新花招
2008/02/12 21:27 | by edwardproAdmin ]
inc的文件会被这样来表现真的非常非常方便,这对于一些老程序是很有益处的,因为老程序往往会不规则地require东西这样看起来很头痛,这样就好多了,一个很不错的改进。
不过凡事有好有坏的,zend studio 6的在build时非常缓慢,如果文件多的话,会蛮惨的。。。
zend studio 6 序列号
2008/02/12 12:24 | by edwardproAdmin ]
用户名:PHPER
注册码:4784D9D0086669570000
深夜了来唱歌囧---爱相随
2008/02/12 05:35 | by edwardproAdmin ]
好久没有唱歌啦,买了SB Live也没有真正用过,前面听到无印良品的演唱会版本爱相随,感觉很有意思,于是抓了谱,配了和弦,就唱了,唱了一个晚上,楼下的同学们估计被我骚扰了,还算好这次比较低调囧。
Windows Media Player文件下面贴下我扒的谱,欢迎指正,因为扫弦部分确实有几个和弦听起来不是太好,水平如此了讲究吧,无印良品唱的降D大调,考虑个人原因唱了D大调,和弦都是C大调的,chorp2.
爱相随
C C G Em
别想你 也忍不住提醒自己
Am G G
伤了心 有些事也要过去
F G C
心很痛 痛的不想再做我自己
F Dm C
别回头 情已去缘已尽
C G G Em
很想你 也不是因为失去你
很想你 也不是因为失去你
Am G G
爱了你 用尽我全心全力
爱了你 用尽我全心全力
F E Am
一生情 只为这一次与你相遇
一生情 只为这一次与你相遇
F G
情难了难再续难再醒
情难了难再续难再醒
Am F
人分飞爱相随
Dm G
那怕用一生去追
Em C
我又怎么能追得回
Am G C Am
与你相慰我为你痴为你累
F G
风雨我都不后悔
C Am
我又怎么有路可退
F G7 C
曾经深情你给了谁
过去的今天在干什么?
2008/02/11 22:25 | by edwardproAdmin ]
2004年的2月11日:忘记了,但肯定是在寒假,度过我最后一个寒假的日子,我应该在家写程序做毕业设计呢
2005年的2月11日:有点模糊了,也许和她在聊天吧,聊到不能在一起的情人节,第一次有情人却没有情人节的日子很奇怪很忧郁,好在我们刚从白雪纷飞的横店回来。
2006年的2月11日:也许我正在工作正在琢磨着换工作的事情。
2007年的2月11日:也许我也在琢磨换工作,似乎作为一个技术不应该如此频繁换工作,但我却是这样的。
其实一切的记忆都那么得不清楚,人往往只是想着明天,却不会想起过去来,多可怕,我忘记了很多日子,我却一直在期待明天,是太贪心了吗?也许吧,人就是这样的,怎样才能珍惜那份过去呢?珍惜着过去才能保持珍惜未来,我是这么想的。
突然感慨一下,完毕。
我的星座
2008/02/11 19:57 | by edwardproAdmin ]
冬天出生的生辰星位或太阳在魔羯座的人的特点:
魔羯座是象征着冬天开始的星座。冬天把绝对意识毫无保留地奉献给了魔羯座出生的人。魔羯座的人,尤其当有几个行星同时处于你的星座时,你将是一个具有现实主义思想和有抱负的人;同时你又容易被热烈的感情征服,是一个有强烈的忘我精神的人。你表情平静而淡漠,不太容易接近,喜欢离群独处。你害怕别人毫无意义的谈话会占据你宝贵的时间,也不能接受别人对你粗暴无礼你严肃认真、思想深沉、始终如一、忠诚可靠、正直廉洁并富有献身精神。另外,你坚如磐石、毫不妥协,不姑息宽容,也从不报任何幻想。你深居简出,喜欢把自己关在象牙塔中,这对你比去经历激情的洗礼要好得多。谨慎可能会使你错过许多良机,于是你便会产生失望和怀才不遇之感。然而,你确实是个有强烈责任感的、勤奋的劳动者和杰出的组织者。如同攀登山峰一样,魔羯座的人的光辉前程,需要用坚持不懈的努力去换取。你的成功主要靠你艰苦奋斗的精神和你的工作能力,而不能指望运气的恩赐。你不喜欢碌碌无为,无所事事,你的实际感促使你不断地改进自己的工作质量和生活环境。
魔羯座的人是以事业为主的,常常把个人生活置之度外。一切都从最现实的观点出发,脚踏实地的从零做起,并追求实实在在的结果。你渴望成功,也许这是为了补偿内心的某种需求或深藏的孤独感,但你从来不会把感情与事业混为一谈。你的逻辑思想、客观态度和组织观念有可能使你进入高职要位,有时还会把你引向社会或政治生活的道路上去。许多国家领导人,在你们的天宫图中都是以魔羯座的影响为主。
一般地说,在青年时期,由于缺乏热情,不太会赢得别人的好感,年轻的时候总是困难重重,有时甚至会历尽艰辛。然而这种处境反会激发你为自己光明的未来奋斗的决心,如果你能把自己的事业坚持到底的话,随着年龄的增长,你的智力优势会越来越显露出来。从五十多岁起,魔羯座的人才能进入你人生的黄金时代。到了晚年,你在精神上和物质上都会达到完美的境界,会品尝到你劳动硕果的甘甜。
(点评:上学的时候是一个完全的异类,总会在一些场合做出一些出格的奇怪举动,小学 初中的班主任都视我为垃圾,虽然学习还行-_-)
魔羯座的人非常珍视用自己辛勤劳动换来的财富。开销很有计划,不喜欢挥霍浪费。勤俭节约是其本色。你从事传统的、有条不紊的工作要比创新的工作更容易成绩卓著。尤其是当土星在魔羯座或水瓶座,或在黄道第Ⅰ、Ⅹ、Ⅶ或Ⅳ宫的时候。
(点评:对物质生活没有任何追求和理想,属于完全的生活白痴,需要一个懂得生活的孩子来帮助我搞定生活的品味,服装啦、家居啦^^)
魔羯座的男性
魔羯座的男性很少表露自己真正的感情,基本上是一个孤独的人。你的生活是在一丝不苟的精神、高度的责任感和逻辑头脑的严格控制下进行的。激情一般是由雄心和权力欲望调动起来的。你总是在辛勤地耕耘,有无懈可击的工作态度。你容易认为别人所做的一切都不理想,一定要自己亲自动手。时间将会证明你的成功。
你有时不想念自己,也不想念别人,思想经常处于忧疑不定的状态中。你对女性保持着一定的距离,因为你怀疑她们的感情的真诚程度。你的感情是很难触及到的。只有当你真心倾与一个女性的时候,深藏的爱才能迸发出来,而且这种爱是经久不衰的。
(点评:从来不把爱说出口,但会做出来看,无时无刻的关怀,有时候甚至是婆妈)
你的情绪经常带有忧郁的成分,只有在知已之间或感到自己被人信任的时候,你的脸上才会露出笑容。否则,你总是沉默不语和静静地观察。结婚以后,你的心仍然会停留在事业上,经常忙于工作,很少有空闲时间。但你非常忠诚,对自己的亲人有极强的责任感,完全可以信赖你。你的亲人应该理解你,对你的周期性的忧郁不必理会和苟求。
生辰星位在巨蟹座的女性温顺、娴雅,你能理解你的性格,并会带给你所需要的温情和无微不至的关怀。
选择处女座的女性作伴侣,有助于在互相尊重的基础上建立一个安定和睦的家庭。 (似乎没有认识的女性-_-,而且命犯天蝎,全军覆没)
你的理想出路是管理、工业、考古、金融、政治批发贸易以及有关土地、地质等职业。
魔羯座不同10°内出生的人的基本性格:
出生日期:12月22日~12月31日
性格特征:这是一个既孤僻又有雄心的性格。行动之前往往先权衡利弊,说话不喜欢开门见山。有极强的工作热情和组织纪律观念,从不放任自己,这一点为你取得卓越成就铺平了道路。然而你有时也缺乏自信心和对别人的信赖这是你经常忧郁的苦恼的根源之一。为了实现你的理想,你不惜付出任何辛劳。
动力来源:成就
出生在魔羯座的著名人士有:莫里哀(法国17世纪伟大剧作家)、巴斯德(法国微生物学家)、毛泽东、斯大林、萨达特(埃及前总统)。
总而言之,魔羯座的你:
审慎的魔羯座的人说:"我不相信"。 (点评:我的口头禅就是:xxx但是xxx。)
表达爱情的方式是:富有理智的。
是一个:喜欢从容不迫、深思熟虑的人。 (点评:我的打车原则就是——缘分,所以从来不去抢,只有我站定了地方我才会去拦车)
渴望:能承担家庭义务的爱人。 (点评:全中)
受骗:由于不敢尝试。
喜欢:去工作。 (no work no good)
害怕:迟到。 (点评:其实不喜欢等人-_-,觉得很浪费时间)
追求:永远正确。 (点评:有时很狂妄)
弱点:参与其事。
有利条件:时间。
不利条件:疑虑。
假期生活:登山运动、下象棋,洞穴探险。(点评:其实喜欢听音乐和看技术书-_-不过爬山是很向往的,只是钱不多,所以。。。)
开支:扩大自己的经济积累。
吉祥金属:铅。 (点评:这大概是我爱吃草米花的原因吧,那个炉子是铅铝合金-_-)
吉祥宝石:缟玛瑙
喜欢的颜色:黑色或海蓝色。 (点评:蓝色是我的最爱色,哈哈)
吉祥日:星期六。
吉祥数字:8、16、26、35。
喜欢的场所:古老的山石景观和幽静的森林。(确实很喜欢幽静的地方,最大的愿望就是带着最爱的人在山顶吹吹风,头发吹起来的感觉很美)
吉祥植物:颠茄、常春藤、柏树、香菜、曼陀罗、树莓。 (点评:香菜是很爱吃的,一般饭店上来的配菜里的香菜都会被我吃掉,当然免不了被人笑笑啦-_-)
人性之作——机动警察剧场版3
2008/02/08 13:25 | by edwardproAdmin ]
故事的名字叫做——第13号废物,讲述的是一个生物学家,因为怜悯一个她没有救活的女孩,用胚胎细胞和癌细胞结合,最终让她神奇的繁衍起来,但是她却是一个怪物,不断袭击人类,人类最终消灭了它,中间有两个分支,很能让人思考:
1 这个怪物实际上是军事方面的试验品(有点生化怪物的味道),但军方最后却因为某种原因要消灭它,因为他败露了某些顶级军事机密。但在调查的过程中,机动警察受到了很大阻力,因为总有人想掩盖什么,这是不是很现实呢,让我们联想到某些事件了吧。
2 最后那个女科学家在体育场的远处看着自己的作品被消灭,在她的心中,那只是那个得了病患的女孩,并不是什么军方的研究品,但是军方最终抛弃了她,她非常难过最后选择了自杀。
看似用一种描述般的手段却带来了很强的情感冲击,而且这种冲击是在片尾一瞬间给出的,相比美国大片日本人的电影更有血有肉,至少看过之后不会立即忘记掉,这就是电影。
设计模式最高境界:有既是无
2008/02/07 14:45 | by edwardproAdmin ]
对了,推荐大家看本书吧,设计模式的,这本书是国内原创的,和国外那些标准教材不同,看起来更简单,描述语言是.net不过除了反射不一样,java也一样可以看明白语法基本一样的。觉得好主要是里边的例子比老外写的学术性教材更容易接受。
可怕的事件
2008/02/07 13:58 | by edwardproAdmin ]
最近太多用php了,居然写函数老是忘记返回值。。。
无类型真可怕
新年快乐
2008/02/06 16:53 | by edwardproAdmin ]
经过短暂的修正进入到新的战斗中,燃烧吧小宇宙!
我因此换了一个新发型:





