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

zabcd117 2008-07-02 10:20:54
数据库中的两个实体是用户-车辆,他们是多对多的关系。
于是有三个表来表示
用户表->用户车辆关系表<-车辆表
同样的,在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再来实现这个功能?
...全文
563 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
centurysky 2012-04-27
  • 打赏
  • 举报
回复
sp讲的是在太抽象,估计没几个人能看懂,能看懂的都是哲理师级别的
ireenter 2008-11-07
  • 打赏
  • 举报
回复
没有很好的思路,参考一下听棠的PSL吧。
zlb789 2008-11-04
  • 打赏
  • 举报
回复
学习
likegod 2008-11-03
  • 打赏
  • 举报
回复
具体的实现方式与三层结构没有必然的联系。
js1722 2008-10-28
  • 打赏
  • 举报
回复
mark.
abcyzq 2008-10-23
  • 打赏
  • 举报
回复
我也遇到楼主同样的问题。
class User
class Vehicle
我是在Vehicle表中增加了userid的引用,去掉了class UserVehicle,在class Vehicle中增加个属性,保存userid,这样查找用户所有的车辆时,调用Vehicle的GetVehicleByUserID(userid).
jiangwuren 2008-10-22
  • 打赏
  • 举报
回复
sp1234讲得太抽象了!有点难理解.

谁能把这问题彻底解清...这贴子很好.
hellogxp 2008-10-06
  • 打赏
  • 举报
回复
我也有此类疑惑
xng168 2008-09-18
  • 打赏
  • 举报
回复
我觉得使用泛型集合效益要高一些!

初学者,还望多多指教!
  • 打赏
  • 举报
回复
[Quote=引用楼主 zabcd117 的帖子:]
2.多对多关系中,我建立了在UserVehicle表上外键约束,User表删除一个ID或者Vehicle表删除一个ID在UserVehicle中就自动删除了,这样我

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

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

1. 程序的目的是干什么?如果程序有一行功能多余,都应该删除,只要达到了逻辑上的控制即可。实际上,自动化关联操作体现了“真实”,而那些过于细碎和需要人工干预的操作设计往往不够真实。

2. 你还是总是从技术层面去限制逻辑层面。在你设计一个软件的时候,忘记你是搞技术的,忘记你用什么语言、什么数据库、什么电脑去实现,把纯粹自然的逻辑控制流程确定下来就行了。
  • 打赏
  • 举报
回复
如果说你发现2实现时有很多代码和1的实现代码很像,那么说明你的数据库组件不够抽象(例如我就使用面向对象ORM而不是ADO.NET),那么你应该从深层解决问题。去动BLL接口来想减少一个冗余的数据库编程代码这个做法是混乱的。
  • 打赏
  • 举报
回复
你的“1、2”没有什么必要硬性比较。

无论底层如何实现,你都可以根据需要设置BLL接口,何来必须“传递”这个规定?这是你自己规定的吧。实际上1和2在设计上应该当作无关的东西。

实际上,当你的业务层需要哪个操作就设计哪个接口,是非常自由的。如果是我,可能1和2两个方法都有,分别实现,毫无关系,无需考虑“传递”和“冗余”。

设计BLL接口是无需纠缠于底层如何实现的。如果你的1和2中有一个在BLL没有这个需求,那么可以注释掉(冗余可以立刻删除,而没有牵制)!我写程序时会直接读取数据库而不会“传递”的!毕竟,这两个东西都是BLL以下的编程考虑,它们分别直接读取数据库、直接反映各自的上层需求就可以了。

可能,你对数据库操作层没有好用的东西,因此把问题归咎于BLL的设计,想用无关的设计来解决编程问题。那么你应该选择一种好用的数据库层,从而轻松地分别实现1和2。
singohuang 2008-09-04
  • 打赏
  • 举报
回复
mark
shawn_yang 2008-08-21
  • 打赏
  • 举报
回复
mark
Smartdoggie 2008-08-21
  • 打赏
  • 举报
回复
基于对象的方法:
在DAL层给Vehicle的IDAL接口增加GetVehicleByUser(string userId)方法
给User的IDAL接口增加AddVehicle(vehicleId)、DelVehicle(vehicleId)方法
rickey 2008-07-19
  • 打赏
  • 举报
回复
Model中只需要User和Vehicle, UserVehicle不反映任何对象(或者说现实生活中的对想)。
ttkkyy 2008-07-14
  • 打赏
  • 举报
回复
期待高手解答!才学.net 在这些地方很迷惑
jiangwuren 2008-07-04
  • 打赏
  • 举报
回复
我是直接在User类的属性里面包含一个IList <Vehicle>

我是这样!

但我自身也有些疑惑.让sp1234来给咱们洗脑吧.或者其它高手
zabcd117 2008-07-04
  • 打赏
  • 举报
回复
大伙要踊跃发言那
Yangbin990 2008-07-04
  • 打赏
  • 举报
回复
up and waiting for answer
加载更多回复(1)

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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