日期:2014-05-20  浏览次数:20865 次

如何处理三层结构中的多对多关系?
数据库中的两个实体是用户-车辆,他们是多对多的关系。
于是有三个表来表示
用户表->用户车辆关系表<-车辆表
同样的,在model层里面定义了三个类
class User
class UserVehicle
class Vehicle
---------------------------------------------------
问题有两个
1.我要查一个用户对应的车辆信息
我是直接在User类的属性里面包含一个IList<Vehicle>好呢还是通过UserVehicle这个类来传递好呢?

1).用前一种方法,假设数据库的表和程序名字一样
sql语句可能是:
select ... from UserVehicle a left join Vehicle b on a.VehicleID = b.VehicleID where a.UserID = @userID
数据访问层就是
public IList<Vehicle> GetVehicleByUserID(string userID)
这样在逻辑层直接调用就可以了

2).用后一种方法就是User类里没有这个属性,在UserVehicle里面有个方法是
IList<UserVehicle> GetUserVehicleByUserID(string userID)
用这个方法得到的UserVehicle集合的VehicleID再到IVehicle里面取Vehicle信息
Vehicle类里面有这个方法
Vehicle GetVehicleByVehicleID(string vehicleID)
这种方法只能到逻辑层去构建一个函数了,也就相当于在逻辑层的一个UserBusiness类里面有个
public IList<Vehicle> GetVehicleByUserID(string userID),在这个函数里进行一系列的操作.

第一种方法感觉对应关系表没有多少意义了,第二种方法又感觉效率太低下,如果用户对应的车多,就得查N次。问问大伙都是怎么来处理这种

情况的?

2.多对多关系中,我建立了在UserVehicle表上外键约束,User表删除一个ID或者Vehicle表删除一个ID在UserVehicle中就自动删除了,这样我

在程序里面就不必自己来删除了,但是给一个用户分配车辆的时候就需要自己来增加UserVehicle中的数据,我的问题是:
1).程序里面只有添加,没有删除,这样是否妥当?

2).我是在数据访问层的User类中增加这个功能呢,还是到逻辑层的时候构建一个UserBusiness再来实现这个功能?

------解决方案--------------------
up and waiting for answer
------解决方案--------------------
大伙要踊跃发言那
------解决方案--------------------
我是直接在User类的属性里面包含一个IList <Vehicle>

我是这样!

但我自身也有些疑惑.让sp1234来给咱们洗脑吧.或者其它高手
------解决方案--------------------
1、放在UserVehicle里处理好些,这样从业务上来讲更加顺畅,你可以在GetUserVehicleByUserID(string userID)中写一个SQL啊,把相关的Vehicle信息一并取出
2、 只有添加,没有删除,完全可以;程序是为应用服务的。但针对基础字典类数据,不建议使用删除,最好使用停用。因为如果你是用了删除操作,必然要对是否曾经使用过该字典数据进行判断,在不判断的情况下删除了该数据,那使用过该字典的表将找不到可用信息。