如何处理三层结构中的多对多关系?

zabcd117 2008-07-02 10:19:40
数据库中的两个实体是用户-车辆,他们是多对多的关系。
于是有三个表来表示
用户表->用户车辆关系表<-车辆表
同样的,在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再来实现这个功能?
...全文
147 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
centurysky 2012-04-27
  • 打赏
  • 举报
回复
看不懂啊,还是不能理解
zabcd117 2008-07-04
  • 打赏
  • 举报
回复
大家踊跃发言哈
zabcd117 2008-07-02
  • 打赏
  • 举报
回复
首先谢谢LS几位伙计的反馈
jinglecat的回答我现在只理解一部分 <6_6>

那么也就是说用第一种对我的项目比较合适了
SQL可以少写,效率也会高一些。只是感觉对象之间的关系荡然无存了....
Jinglecat 2008-07-02
  • 打赏
  • 举报
回复
以下是基本股价,看起来是够 elegant,但可想而已手工编码的工作量,
而且,我略去了许多额外逻辑控制....

// Model
class User
{
public int ID
{
get;
set;
}
public VehicleCollection Vehicles // 集合类型通常不公开 setter
{
get;
}
}

class UserCollection : Collection<User>
{
}

class Vehicle
{
}

class UserCollection : Collection<User>
{
public UserCollection Users // 集合类型通常不公开 setter
{
get;
}
}

// BLL
public VehicleCollection GetVehiclesOfUser(string userId)
{
User user = new User(userId);
return GetVehiclesOfUser(user);
}

public VehicleCollection GetVehiclesOfUser(User user)
{
return DAL.FillVehicles(user);
}

// DAL
public VehicleCollection FillVehicles(User user)
{
//...
DbCommand.Parameters.Add("@UserID", user.ID);
// ...

using(DataReader){
while(DataReader.Read()){
Vehicle v = new Vehicle();
v.ID = (int)dr["VehicleID"];
//...
user.Vehicles.Add(v);
}
}

}
Jinglecat 2008-07-02
  • 打赏
  • 举报
回复
1.
不应有 class UserVehicle 的存在

2.
”理想“的设计也许是
<<<place holder>>>

3.
LZ所列问题,我想都是困恼OO新手的常见问题,实际上这些都是 Object- Relation 之间不可逾越的鸿沟所造成

按大师的理想设计,舒服的 OO,只有通过 O/R mapping 工具如 Nhibernate, Unit,ActiveRecord 才能完成,
其中需要注意的是 lazy-load

自己实现“完美” Persistence Layer 是一项可怕的工作量,进度控制下,符合自己的需求即可!
gxjcr 2008-07-02
  • 打赏
  • 举报
回复
搂主很强,顶
loveniki 2008-07-02
  • 打赏
  • 举报
回复
菜鸟路过,帮顶
zabcd117 2008-07-02
  • 打赏
  • 举报
回复
大伙各抒己见啊

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧