首页 新闻 搜索 专区 学院

如何合理安排对象和数据表之间的映射?

0
悬赏园豆:10 [已解决问题] 解决于 2011-10-25 13:55

前言:
这个话题可能被讨论过很多次,但是我还是比较含糊,主要在使用ORM框架进行对象->表
映射时比较矛盾,所以希望听听大家都意见!主要还是数据冗余和执行效率的问题.

案例:

A表
create table A
{
  aid int not null primary key,
  name varchar(20) not null
}
B表
create table B
{
  bid int not null primary key,
  name varchar(20) not null
}
AB表
create table AB
{
  id int not null primary key,
  aid int not null,
  bid int not null
}

PS:暂时不讨论表字段设计如何如何... :P

映射对象

对象A 
class A
{
  public int Aid { get; set; }
  public string Name { get; set; } 
}
对象B 
class B
{
  public int Bid { get; set; }
  public string Name { get; set;}
}

对象A,B和表A,B 在进行映射时,直接对应属性绑定就OK,但是...,对象AB和表AB
如何做映射好呢?看下面...

举例:

class AB
{
  public int Oid { get; set; }
  public A ObjA { get; set; }
  public B ObjB { get; set; }
}
<!-- 这里主要演示查询 -->

ORM映射文件
<xml id="result-map">
  <property="Oid" colum="oid" />
  <property="ObjA.Aid" colum="aid" />
  <property="ObjA.Name" colum="aname" />
  <property="ObjB.Bid" colum="bid" />
  <property="ObjB.Name" colum="bname" />
</xml>

<select id="selectABById" resultmap="result-map">
  SELECT _AB.id AS oid,
  _A.aid as aid,_A.name as aname,
  _B.bid as bid,_B.name as bname
  FROM AB AS _AB
  INNER JOIN A AS _A ON _AB.aid = _A.aid
  INNSER JOIN B AS _B ON _AB.bid = _B.bid
  WHERE _AB.id = 1
</select>


这个就是问题所在,这样我每次查询AB对象,都要联合映射A,B对象,这样很是影响效率.
如果我在AB表中加上A表-name和B表-name,那么我查询就很简单明了.只是多了两个
冗余字段而已?大家觉得如何处理这个映射是好呢? 要么像举例的那样,查询影响效率,
更新方便;要么给AB表添加冗余字段,查询方便,更新麻烦?




kaleyroy的主页 kaleyroy | 初学一级 | 园豆:160
提问于:2011-10-21 01:11
< >
分享
最佳答案
0

1. 可以考虑用子查询,然后用mybatis的级联;你要这个对象不就要AB的ID吗?

resultmap个人觉得别这样写,累死人的要是数据结构发生改变的话.

<xml id="result-map">
  <property="Oid" colum="oid" />
  <property="ObjA.Aid" colum="aid" />
  <property="ObjA.Name" colum="aname" />
  <property="ObjB.Bid" colum="bid" />
  <property="ObjB.Name" colum="bname" />
</xml>
用association标签

2. 关于冗余,尽量不要,你是查询起来方便了,但你维护起来呢?你这是做信息,要是数据维护出错了,真的不好.

如有说的不合理的地方,请指正

收获园豆:8
trancedly | 菜鸟二级 |园豆:266 | 2011-10-21 10:09

第一点@
谢谢兄弟提醒!MyBatisNet应该用resultMapping达到一样效果吧:P
第二点@
我的想法和兄弟一样:P

kaleyroy | 园豆:160 (初学一级) | 2011-10-21 11:47
其他回答(1)
0

看情况,有时冗余是必要的,但不要过多

收获园豆:2
artwl | 园豆:16536 (专家六级) | 2011-10-21 09:54

兄弟说得在理!谢谢回复!

支持(0) 反对(0) kaleyroy | 园豆:160 (初学一级) | 2011-10-21 11:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册