写出脏乱差的代码了。悲剧,求可以帮助实现数据关系映射操作的的参考材料。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
raincious
V2EX    PHP

写出脏乱差的代码了。悲剧,求可以帮助实现数据关系映射操作的的参考材料。

  •  
  •   raincious Jun 10, 2013 3655 views
    This topic created in 4707 days ago, the information mentioned may be changed or developed.
    好吧,我猜你可能会说:不要自己写ORM。就像这位Jimmy Bogard说的:

    http://lostechies.com/jimmybogard/2012/07/24/dont-write-your-own-orm/


    但是我觉得好有意思,于是……我用“不理睬”的解决方案,自己凭借想法实现了个(类似)ORM(的东西)。目前实现的功能比如:

    // C
    $model = new userModel();
    $model->username = 'username';
    $model->password = 'password';
    $model->insert();

    // U
    $model = new userModel();
    $thing = $model->get(array('userID' => 1)); // R,这里就分出个实例了

    $thing->username = 'username';
    $thing->password = 'password';
    $thing->save();

    分实例主要是为了fetch,因为:

    $thing = $model->fetch();
    foreach($thing AS $user) {
    echo $user->username; //只有这样才能实现这样
    $user->username = 'new' . $user->username;
    $user->save(); // 以及这样
    }

    // D
    $thing->delete();

    但是呢,即便是写成这样了(我觉得写的很差),我觉得还差了很多东西。。

    这是哪个ORM的代码,我想。。各位看了就明白:https://github.com/raincious/facula/blob/master/libraries/orm/class.simpleorm.php

    首先我觉得太浪费内存了,因为fetch每次都会创建一个自己,那么原来的对象就相当于没用了。我想了很久如何复用这个实例,但是怎么都无法满足在一个实例里完成所有get、fetch、save、insert之类的操作。(试过迭代器之类,或者数组ArrayObject,都不完美)

    总之就是觉得自己写的不靠谱,脏乱差,于是想求各位有经验的同学来推荐下相关方面的资料(最好是在线的)用来详细了解相关的设计和原理。

    谢谢。
    6 replies    1970-01-01 08:00:00 +08:00
    wtbhk
        1
    wtbhk  
       Jun 11, 2013
    楼主比我写的好多了,我上次那坑因为有多对多的关系,至今没找到好的解决方案(其实是有好的方案但是无法理解)
    raincious
        2
    raincious  
    OP
       Jun 11, 2013
    @wtbhk 多对多我也没法解决,想想看……就不支持好了……

    现在我担心的还是创建的实例太多了。我发完这个帖子之后把代码改了下,用fetchWith的时候一部分实例创建之后会自动注销。但是内存占用还是没降下来。

    我只Fetch了10个Row,内存使用就2M了,要是100个Row那真不敢想……。

    又或者可能我太过敏了,就算100个row也和10个row区别不大?

    反正我这套数据库查询的东西一起用。。我就觉得代码速度慢了一大截,捉鸡啊真。
    chemzqm
        3
    chemzqm  
       Jun 11, 2013
    我觉着关系型数据库查询ORM就是个硬伤,效率低不算,维护更让人恶心,不如拼接sql语句呢。
    raincious
        4
    raincious  
    OP
       Jun 11, 2013
    @chemzqm 是的,所以有人说ORM是反射计:http://seldo.com/weblog/2011/08/11/orm_is_an_antipattern

    所以我目前写这个ORM的另一个目的是评估必要性。

    而且说真的,如果不考虑兼容新,拼接SQL语句个人感觉真是最贴心的……
    raincious
        5
    raincious  
    OP
       Jun 12, 2013
    悲剧,果然很占用内存。

    从数据库里取出2000个结果返回为对象实例,未联表,使用了9兆内存。

    改为返回数组,使用5兆内存。

    所以内存耗费还是挺高的。

    但是……速度尚可,两次查询速度接近。我准备忽略这个问题了。反正我的ORM提供了选项,fetch能够在返回对象实例和对象结果数组中作出选择。
    hardway
        6
    hardway  
       Jul 13, 2013
    个人很喜欢<a href='http://www.martinfowler.com/eaaCatalog/activeRecord.html'>ActiveRecord</a>模式

    我的ORM和楼主差不多,不过fetch这一块是用_callStatic来实现了类似:
    User::get($id)
    User::find_all(array($c1=>$v1, $c2=>$v2, "condition, limit, order, ..."))
    User::find_one(array($c1=>$v1, $c2=>$v2))
    User::find_by_firstname($name)
    User::find_one_by_firstname($name)
    About     Help     Advertise     Blog     API     FAQ     Solana     842 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 20:41 PVG 04:41 LAX 13:41 JFK 16:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86