目前有个关于机票销售系统的有一个需求是这样的:   机票代理商可以在系统上销售机票,每个代理商销售的机票可能只限定在某个城市,比如,A代理商只能销售从成都出发的机票,而B代理商可以销售全国各大城市出发的机票。
  
原来的设计是 
1.将 全国的城市以代码表的形式存在一张city表中,其中有字段 CityId(序列),cityCode(城市代码),cityName(城市名)
2.每个代理商有一个可以出票的城市列表,都放在ticket_city表中,有字段id,cityId(外键city表),代理商ID(外键代理商表) ,这里可以表示代理商有多个出票城市下面问题来了,如果A代理商可以销售全国的机票,那么ticket_city就会有city一样多的记录,如果B代理商可以销售除杭州之外的所有机票,那么差不多也和city一样多,这样就会造成ticket_city表记录成倍增长。而且对这些代理商进行城市维护也不太方便。请问各位有没有什么好设计方法或者经验可以解决这个问题?  目前正在考虑重新设计这部分,具体设计方案正在研究中,各位有什么好的意见。
  
  

解决方案 »

  1.   

    目前的设计明显就是一个多对多的例子啊,ticket_city不过是代理商和city之间的中间表而已。你们说的多对多是什么意思?呵呵。不会是打马虎眼吧
      

  2.   

     没有人进来提点意见啊,晕哦。 目前的问题的是,要是以后增加一个城市,那么代理商要卖全国机票的话,都得给他在ticket_city中增加进去,这个比较烦人。
      

  3.   


    你的设计方法我也考虑过,其实就是维护一些规则,存少的在里面。这样表中数据倒是少,估计业务处理起来很复杂了就。 原来的设计方式按照估计的话,全国大概300个出票城市。 使用我们系统的代理商假设每个城市3家,那么就有900家,假设都可以出全国票的话,那么ticket_city就有900*300=27W条记录。这个应该是在未来3-5内封顶的记录数。如果按照添加规则的方式,那么基本上就900条记录就可以搞定,当然业务上处理起来就要进行规则运算。还是得衡量一下啊
      

  4.   

    1. CityId(序列), CityCode(城市代码)好像重复了,CityCode 做主键就行。
    2. 建一个城市分组表,groupid,groupname,cityids(成员城市id列表)。
    3. ticket_city 表加一个字段,groupid(外键),cityid 和 groupid 二选一存储,如果有 cityid 则忽略 groupid。
    业务逻辑会稍复杂点,但存储数据量能少点。怎么取舍就看需求了。