数据库中的两个实体是用户-车辆,他们是多对多的关系。
于是有三个表来表示
用户表->用户车辆关系表<-车辆表
同样的,在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再来实现这个功能?
于是有三个表来表示
用户表->用户车辆关系表<-车辆表
同样的,在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再来实现这个功能?
解决方案 »
- RDLC报表发布后出错
- cache的问题
- 母板页加框架
- string字符串 怎么变成gb2312格式的 请看看!~~~
- 没分了,大哥们帮帮忙!firefox下javascript读取xml文档
- IIS错误,服务器太忙,但是iis设置正常,机器cpu,带宽也不高,郁闷!
- 菜鸟求救,怎么判断session为空值?
- b/s结构中,多个客户端可能在同一时间对同一条记录进行更新,此时数据库怎么处理?
- GridView结合DetailsView中插入新记录后的问题
- 关于HtmlInputFile控件上传文件
- 诚心求教利用ActiveXObject("htmlfile")实现Server Push在FireFox不兼容的处理方法!!!在线狂等~!!!急!!!!!!
- c#调用js中window.location.href进行页面传值??????????????大问题!郁闷...
不应有 class UserVehicle 的存在2.
”理想“的设计也许是
<<<place holder>>>3.
LZ所列问题,我想都是困恼OO新手的常见问题,实际上这些都是 Object- Relation 之间不可逾越的鸿沟所造成按大师的理想设计,舒服的 OO,只有通过 O/R mapping 工具如 Nhibernate, Unit,ActiveRecord 才能完成,
其中需要注意的是 lazy-load自己实现“完美” Persistence Layer 是一项可怕的工作量,进度控制下,符合自己的需求即可!
而且,我略去了许多额外逻辑控制....// 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的回答我现在只理解一部分 <6_6>那么也就是说用第一种对我的项目比较合适了
SQL可以少写,效率也会高一些。只是感觉对象之间的关系荡然无存了....