按照我对范式的理解,表的多对多需要三张表.
比如电影和电影分类是多对多关系,需要电影表,电影分类表,电影电影分类关系表.但是我问我一个同学,他说很多时候多对多用两张表实现,上面那个例子
只需要电影表,分类表.
电影表里有个字段记录电影对应的分类id.
从电影查分类直接就可以根据分类id查到,从分类查电影对那个有分类id的字段做like查询.这两种方式在性能上有什么区别?都适应于什么样的情况呢?另外我似乎在什么地方看到过说hibernate里最好不要用多对多,是什么意思呢?

解决方案 »

  1.   

    规范点儿还是三张表吧
    like这东西,我理解性能还是有影响另外,hibernate里最好不要用多对多
    这句话跟你这个三张表没冲突
    他是说,用两个一对多,比一个多对多好点儿
      

  2.   

    这两种方式确实都可以实现多对多.具体采用哪中方式要根据实际的业务来确定.hibernate通常是选用多加一个中间表来实现多对多,最主要的原因是因为hibernate中是要把数据库中的表对象化,所以引入一个中间表更便于对象之间的关联.但是这并不是必须的,在后台用存储过程实现的时候,也有用两张表就实现多对多的.在这里说一下,如果多对多的关系是双向的,个人建议还是引入中间表比较合理.
      

  3.   

    多对多转换成两个一对多,不是你同学说的那种!
    这个跟数据库本身没关系,就是hibernate中的映射配置问题!现在说说两个表和三个表的区别
    按你举得例子,最大的区别就是按分类来查询电影
    三个表的时候,直接通过分类id查到所有影片的id,这些关键字段都可以在数据库中建立索引,速度应该很快两个表,我理解你是在电影的分类id字段存所有的分类id,比如","号分隔,like查询首先数据库处理like查询,比建立索引的关键查询慢很多,我个人这么理解。数据量小的话,这应该不明显,但是数据量大的话,估计会差几个数量级
      

  4.   

    感觉我自己误导了大家...不该说那个hibernate多对多..我主要想了解三张表的方式和两张表的方式在性能上有什么区别?
    什么情况下用哪种比较好.ps:to ZiSheng:明明就是多对多..囧...