小弟新到一小公司,居然当起了主力开发人员,从需求到总体设计文档 都是头儿指导下
我来编写,然后他给意见 .  最近设计数据库表
有这样一需求
有A,B,C三款类型的产品
有一笔订单里有 A类型产品3个, B类型产品2个, C类型产品2个
受hibernate的影响比较大
(在mysql下)我是这样考虑的 设计成 两个表(订单表, 类型表) 多对多  当然这样hibernate生成的时候会 多出一个订单和产品类型的关联表
订单表如下
id    订单号      收货人  收货地址
1     201035       张三      北京
2      201052     李四       南京
3      201018      王五       天津产品类型表如下
id       产品类型代号      产品类型名
1         A                       一天精通java
2         B                        两天精通java 
3         C                        三天精通java关联表  (这两个字段 联合为 复合主键)
订单id     产品类型id
1                1             --- 对应A类型
1                2             --- 对应B类型
1                3             --- 对应C类型
2                1
2                2
2                 3  这看起来没什么不对劲的,直接在hibernate里面多对多就好了, 但是 当要实现  一笔订单里有 A类型产品3个, B类型产品2个, C类型产品2个 这个需求的时候
关联表中的数据如下:                                                  订单表的数据如下:订单id     产品类型id                                             产品类型id      类型代号
1                1             --- 对应A类型                            1                 A
1                2             --- 对应B类型                            2                 B
1                3             --- 对应C类型                            3                 C
1                4            ----对应A类型                             4                A
1                5             ----对应A类型                           5                 A
1                 6             ----对应B类型                          6                  B 
1                 7             ---对应C类型                            7                 C
现在还只是一条订单(交易)记录, 就让这上面两个表数据在膨胀,  当有多条订单, 这些表的数据会越来越多的,
头儿坚决不赞成我这样的搞法

他的设计是(他不懂hibernate,所以就没考虑表对应的实体类之间的关系)
订单表如下
id    订单号      收货人  收货地址
1     201035       张三      北京
2      201052     李四       南京
3      201018      王五       天津产品类型表如下
id       产品类型代号      产品类型名
1         A                       一天精通java
2         B                        两天精通java 
3         C                        三天精通java还一个 订单包含产品表 ( A类型产品3个, B类型产品2个, C类型产品2个 )
id   订单id   产品类型id                 该类型产品的个数
1     1             1  (对应A类型)                3
2     1             2  (对应B类型)                2
3     1             3  (对应C类型)                2 
4     新订单id    产品类型id                  N
===============================================
在他的努力说服下(我们为此讨论了三次,我为这个搞了一天时间) ,我认为他设计的的确比较合理
现在的问题来了, 这样的设计用hibernate我无法映射(无法确定实体类及关系),有哪位知道的哥们麻烦点解下或者你有更好的建议,也请不吝赐教,最好能映射成实体类,让hibernate能自动生成出你设计的表结构谢谢大家了

解决方案 »

  1.   

    小弟新到一小公司,居然当起了主力开发人员,从需求到总体设计文档 都是头儿指导下
    我来编写,然后他给意见 .  最近设计数据库表
    有这样一需求
    有A,B,C三款类型的产品
    有一笔订单里有 A类型产品3个, B类型产品2个, C类型产品2个
    受hibernate的影响比较大
    (在mysql下)我是这样考虑的 设计成 两个表(订单表, 类型表) 多对多  当然这样hibernate生成的时候会 多出一个订单和产品类型的关联表
    订单表如下
    id    订单号      收货人  收货地址
    1     201035       张三      北京
    2      201052     李四       南京
    3      201018      王五       天津产品类型表如下
    id       产品类型代号      产品类型名
    1         A                       一天精通java
    2         B                        两天精通java 
    3         C                        三天精通java关联表  (这两个字段 联合为 复合主键)
    订单id     产品类型id
    1                1             --- 对应A类型
    1                2             --- 对应B类型
    1                3             --- 对应C类型
    2                1
    2                2
    2                 3  这看起来没什么不对劲的,直接在hibernate里面多对多就好了, 但是 当要实现  一笔订单里有 A类型产品3个, B类型产品2个, C类型产品2个 这个需求的时候
    关联表中的数据如下:                                                  订单表的数据如下:订单id     产品类型id                                             产品类型id      类型代号
    1                1             --- 对应A类型                            1                 A
    1                2             --- 对应B类型                            2                 B
    1                3             --- 对应C类型                            3                 C
    1                4            ----对应A类型                             4                A
    1                5             ----对应A类型                           5                 A
    1                 6             ----对应B类型                          6                  B 
    1                 7             ---对应C类型                            7                 C
    现在还只是一条订单(交易)记录, 就让这上面两个表数据在膨胀,  当有多条订单, 这些表的数据会越来越多的,
    头儿坚决不赞成我这样的搞法

    他的设计是(他不懂hibernate,所以就没考虑表对应的实体类之间的关系)
    订单表如下
    id    订单号      收货人  收货地址
    1     201035       张三      北京
    2      201052     李四       南京
    3      201018      王五       天津产品类型表如下
    id       产品类型代号      产品类型名
    1         A                       一天精通java
    2         B                        两天精通java 
    3         C                        三天精通java还一个 订单包含产品表 ( A类型产品3个, B类型产品2个, C类型产品2个 )
    id   订单id   产品类型id                 该类型产品的个数
    1     1             1  (对应A类型)                3
    2     1             2  (对应B类型)                2
    3     1             3  (对应C类型)                2 
    4     新订单id    产品类型id                  N
    ===============================================
    在他的努力说服下(我们为此讨论了三次,我为这个搞了一天时间) ,我认为他设计的的确比较合理
    现在的问题来了, 这样的设计用hibernate我无法映射(无法确定实体类及关系),有哪位知道的哥们麻烦点解下或者你有更好的建议,也请不吝赐教,最好能映射成实体类,让hibernate能自动生成出你设计的表结构谢谢大家了
      

  2.   

    大家看上面的html格式的 表结构 看着更清楚一些  多谢了
      

  3.   

    很明显,订单包括产品表(对应的实体类) N---1  订单表,订单包括产品表 N---1  产品类型表,hibernate里直接映射。
      

  4.   

    他的设计是(他不懂hibernate,所以就没考虑表对应的实体类之间的关系)
    订单表如下
    id 订单号 收货人 收货地址  该类型产品的个数
    1 201035 张三 北京             3
    2 201052 李四 南京             2
    3 201018 王五 天津             1产品类型表如下
    id 产品类型代号 产品类型名
    1 A 一天精通java
    2 B 两天精通java  
    3 C 三天精通java还一个 订单包含产品表 ( A类型产品3个, B类型产品2个, C类型产品2个 )
    id 订单id 产品类型id 
    1 1 1 (对应A类型) 
    2 1 2 (对应B类型) 
    3 1 3 (对应C类型) 
    4 新订单id 产品类型id N
    把第三张表作为关系表  这样应该可以
      

  5.   

    表A、B、C你的设计:A< manytomany >B你们头的设计:A<onetomany> C  C< manytoone> B个人的一点小意见!
      

  6.   

    你头的设计明显是对的,有那么多要考虑的吗?
    你设计不出实体类,是你理解的问题,你不妨这样理解
    (1)订单实体
    订单表如
    id 订单号 收货人 收货地址
    1 201035 张三 北京
    2 201052 李四 南京
    3 201018 王五 天津
    (2)产品类型实体
    产品类型表如下
    id 产品类型代号 产品类型名
    1 A 一天精通java
    2 B 两天精通java  
    3 C 三天精通java
    (3)订单明细实体,就是说一个订单其实是包含多个订单明细的,(就是你们说的订单包含产品)
    表结构如下
    id 订单id 产品类型id 该类型产品的个数
    1 1 1 (对应A类型) 3
    2 1 2 (对应B类型) 2
    3 1 3 (对应C类型) 2  
    4 新订单id 产品类型id N这样 订单 1----N 订单明细
         订单明细 N----1 产品类型
       
    这样难道还不理解吗,你订单和产品之间直接建关系是不合理的,因为没有考虑到数量的问题