以前和同事讨论过,总的来说有两种数据模型的设计,一种好像叫离散模型,还有一种叫不出名字。说的不清楚看例子吧,现有对象人(People),一个人拥有多辆自行车(Bike),有两种类型的设计:
离散型:人和自行车完全分离,仅通过自行车的PeopleID关联
public class People
{
  public string ID;
  public string Name;
  public string Address;
}
public class Bike
{
  public string ID;
  public string PeopleID;
  public string Num;
}
另外一种类型:人中包含一个自行车列表,或者自行车中包含一个人的对象,或者两种都包含
public class People
{
  public string ID;
  public string Name;
  public string Address;
  public List <Bike> BikeList;
}
public class Bike
{
  public string ID;
  public string PeopleID;
  public string Num;
  public People people;
}
这两种模式应该在网上产生过激烈的讨论,可是我一篇文章都搜不到(可能是关键字不对),望高手们贴几个链接出来,谢过先。

解决方案 »

  1.   

    看楼主的意思,人与自行车是一对多的关系吧?如果是一对多的关系,那么第一种设计是关系数据表的设计,Bike.PeopleID与People.ID外键关联;第二种设计是域模型的设计。这两种设计谈不上优劣,一个适用于关系型数据库,一个适用于OOP的类设计,你画出ER图和UML对比一下就知道了。建议楼主看看Hibernate,如果怕麻烦用Castle的ActiveRecord也行,里面有HasMany-BelongsTo的模式,可以完美地解决这种一对多的关系数据模型与域模型的映射。
      

  2.   

    哦,对了,第一种设计,对于“纯粹的”ORM来说很别扭,可以用ibatis.net这种“表映射”的模式来解决。
      

  3.   

    人和自行车是一对多的关系。
    这两种设计都是对象的设计,当然用NHibernate或IBatisNet都可以很好的实现。
    这两种设计各有优缺点,据说第一种设计适合实体类和操作类分离,第二种适合实体类和操作类写在同一个类中。希望能找到以前相关讨论的帖子。
    第一种设计,对于“纯粹的”ORM来说很别扭,呵呵,我觉得第二种应该更别扭吧,望详细说明。
      

  4.   

    回复cnming:
    意思是说你赞成第二种设计?
      

  5.   

    第一种设计适合实体类和操作类分离,第二种适合实体类和操作类写在同一个类中???你说的是失血模式和贫血模式吧?
    你可以看看这里的讨论:
    http://www.javaeye.com/topic/210993
    http://www.javaeye.com/topic/11712你再仔细回味一下,有没有觉得第二种设计更OO?