大家怎么看 NoSQL 的 ORM - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tonghuashuai
V2EX    NoSQL

大家怎么看 NoSQL 的 ORM

  •  
  •   tonghuashuai 2013-11-13 15:50:05 +08:00 15244 次点击
    这是一个创建于 4354 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在用关系型数据库时,比较关心 ORM,但是最近用 Redis 和 MongoDB 时,发现用现有 API 已经不再迫切需要这种映射了。

    大家怎么看?
    第 1 条附言    2013-11-13 17:11:33 +08:00
    忘了说了,我用的是 Python
    12 条回复    1970-01-01 08:00:00 +08:00
    humiaozuzu
        1
    humiaozuzu  
       2013-11-13 15:55:22 +08:00
    记得 SO 上面有开贴专门讨论过,结论就是不推荐用 ORM,丧失的灵活性不划算,而且 ORM 你干嘛用 NOSQL
    alsotang
        2
    alsotang  
       2013-11-13 16:07:04 +08:00
    @humiaozuzu
    “而且 ORM 你干嘛用 NOSQL”,用 nosql 又不一定是为了 无schema。mongodb 和 gae datastore 的最佳实践都认为最好数据是有schema的,这样好处理。
    回到楼主的问题上来,mongodb 的其实叫 odm,orm 的 r 是关系,d 是文档。如果说楼主觉得现在已经不是很必要用 odm 了话,或许楼主是在通过 js 操作 mongodb 吧。如果是用 js,确实很多时候并不需要 orm 就可以很方便地操作文档,因为 json 表示的数据本来就很好操作。
    但在操作 json 没有这么方便的语言中,比如 python 或者 ruby 甚至 java 的话,如果不封装个对象,就很难对有结构的数据进行操作啊。
    我们现在公司开发有用到sql,后端用node。我也没有感觉有使用 orm 的需要。json 就已经很舒服了。
    est
        3
    est  
       2013-11-13 16:28:39 +08:00
    NoSQL用 ORM 就是发明 RDBMS 的节奏。
    yangff
        4
    yangff  
       2013-11-13 16:59:02 +08:00
    @alsotang ruby有元编程,用method_missing + define_method也不错就是了。
    http://ruby-china.org/topics/3434
    tonghuashuai
        5
    tonghuashuai  
    OP
       2013-11-13 17:12:19 +08:00
    @alsotang
    用 Python 的话,数据用字典接应该也挺方便的吧
    min
        6
    min  
       2013-11-13 17:25:31 +08:00
    json之类的话,没有必要做document to object mapping吧
    ququzone
        7
    ququzone  
       2013-11-13 17:30:26 +08:00
    这个主要看是哪种类型的NoSQL啦,MongoDB本身就是文档数据库,用了多余,Redis结构主要在Key上面体现,也没有必要,但是big table类的NoSQL用ORM处理起来方便多了,自己维护更新太麻烦,像Gora之类的ORM可以很好的封装通用操作,你只管写业务就可以啦。
    chloerei
        8
    chloerei  
       2013-11-13 17:32:06 +08:00
    ODM 可以提供这些功能:getter/setter,校验,关联方法,回调等等,如果不需要这些功能就不需要 ODM 了,例如记日志。
    alsotang
        9
    alsotang  
       2013-11-13 20:25:00 +08:00
    @chloerei 老实说,这些东西还是相当方便的。在应用开发来说。
    v88ex
        10
    v88ex  
       2013-11-13 21:31:12 +08:00
    我用过Mongoengine,这个ORM和sqlalchemy不同的是,他只能是在应用层做约束。而不是深入到数据库层。
    如果业务逻辑很复杂。还是有必要拿个东西做应用层约束。否则不检查就直接写入数据库容易造成业务逻辑错误。
    yyfearth
        11
    yyfearth  
       2013-11-14 04:06:30 +08:00
    用JS之类的动态语言,如果不需要schema进行验证和添加其他逻辑就不需要ODM,这个是自然的。但是做起来往往还是需要作验证操作,当然你可以用单纯validation的框架,也可以用ODM来作。

    但是如果你用Java这样的静态类型语言,不用ODM转换成Object看你怎么操作。
    用NoSQL又不一定是要他的No Schema特性,有时候仅仅是为了性能或者可扩展性。

    对于Python而言 估计和Ruby差不多,如果你觉得直接对字典进行操作当然可以不用,如果你想对Object操作,尤其你想在Entity上面加上一些逻辑,用ODM就又意义了。如果你打算自己封装,那么相当于自己作一个轻量级的ODM。
    c19
        12
    c19  
       2013-11-14 20:59:14 +08:00
    我用mongodb一开始试了几个ORM,写得非常爽,但熟悉原生API后发觉,ORM什么的让我爽得地方只是写出来干净,用原生API其实很方便,一次读取得东西就在一个Document里,有时候再加projection取所需得,没有ORM或ODM得必要,像楼上说的,写着写着你就自己写出了个轻量ODM。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2981 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 00:28 PVG 08:28 LAX 17:28 JFK 20:28
    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