对象/模型之间的关联大家都是怎么处理的?“双向关联”和“单向关联”的选择问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huanglk
V2EX    编程

象/模型之间的关联大家都是怎么处理的?“双向关联”和“单向关联”的选择问题。

  •  
  •   huanglk 2014 年 11 月 14 日 4628 次点击
    这是一个创建于 4095 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天看《重构》一书说到“双向关联”和“单向关联”的转换。
    比如`Customer`和`Order`之间的关系,很多时候我们需要根据Customer来对相关的orders做操作(增删查改),很直接的做法是在Customer里直接添加一个字段来保存一个list或者set,这就形成一个单向关联的关系了。之后如果又需要根据Order来获取对应的customer的话,一般你们会怎么选择?在Order里面增加一个字段来保存?还是以性能为代价,设置一个getCustomer()函数来遍历所有的customers并返回符合要求的customer?
    这类问题我之前第一次独自做web后台模型层时自己把自己绕晕了,因为用了双向关联,而且字段都存了ID,没有用SQL的外键(不太希望数据库帮自己做一些自己还不是很了解的事情),最终导致各种不一致,比如删除一个customer没有删除对应的orders等低级问题,而且最后解决这些问题也是很痛苦的过程,这或许也是我想看《重构》这类书的原因之一,但还是觉得自己的变成经验还是太少了,只一两个做过小型网站,所以感觉自己对这一块的思想还不是很清晰,请大家多多指教~
    4 条回复    2014-11-15 08:23:05 +08:00
    meta
        1
    meta  
       2014 年 11 月 14 日
    一个订单难道不是只能有一个客户吗,如果一个订单都有多个客户了,那么这不形成一个多对多关系了吗,这种多对多的关系显然应该拆成两个一对多关系嘛。另外,本身关系数据库处理这种事情就比较麻烦的,所以现在大家不都nosql了吗。
    incompatible
        2
    incompatible  
       2014 年 11 月 14 日
    个人愚见:
    Customer中没有必要保存List<Order> 不然莫非List<Address> List<Favorite>这些都要各存一份?
    通常只要提供OrderService.listOrderOfCustomer(customerId)这种服务就够了

    关于你的不一致的问题:
    不知你使用的是什么语言及orm工具。一些orm工具是可以支持级联删除的
    我自己在这种场景下通常不依赖数据库外键或orm工具,在一个事务中先后做删除Customer和Order的操作即可
    huijiewei
        3
    huijiewei  
       2014 年 11 月 15 日
    为什么要在 Customer 里面保存 Order 的关联?

    按照一般业务逻辑,一个订单肯定属于一个用户的,一个用户可以有多个订单,那么这就是一对多关系,一对多关系,应该在“多”的那个实体上存储“一”的关联。

    多对多关系的话,应该建立一个关联表来进行关联。

    一对一,一对多,多对多这种关联是很基础的,不管是关系型数据库还是 NoSQL 处理起来都是非常成熟了。

    级联删除一般自己使用事务处理。
    JamesRuan
        4
    JamesRuan  
       2014 年 11 月 15 日 via Android
    缺乏数据库知识的表现,这类问题前人早就思考过了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2182 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 02:48 PVG 10:48 LAX 18:48 JFK 21:48
    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