前言:
这个话题可能被讨论过很多次,但是我还是比较含糊,主要在使用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表添加冗余字段,查询方便,更新麻烦?
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. 关于冗余,尽量不要,你是查询起来方便了,但你维护起来呢?你这是做信息,要是数据维护出错了,真的不好.
如有说的不合理的地方,请指正
第一点@
谢谢兄弟提醒!MyBatisNet应该用resultMapping达到一样效果吧:P
第二点@
我的想法和兄弟一样:P
看情况,有时冗余是必要的,但不要过多
兄弟说得在理!谢谢回复!