#1 jake

数据表间关联是数据库操作常见的一种应用。sp框架提供了多种表间关联的功能支持,令开发者可以轻松应对各种数据表关联情况。

在sp框架的定义中,数据表表间关联主要存在以下三种情况:

1、一对一的关联。一对一的情况也可以理解为将一个较大的数据表拆分为两个表,然后两个表之间一一对应。一对一关联中,记录完整并且不可或缺的表可以称之为主表,而不一定是完整的但记录都会与主表一一对应的表可以成为从表。

举个例子,腾讯QQ我们有一份个人资料,那可以说是一个主表;然后我们在QQ空间内又可以有空间的资料,那就是一个从表。主表的记录是完整的,正如有使用QQ的人都有QQ资料一样;但是从表未必完整,用QQ的人没开通QQ空间,那这人就没有空间资料了,不过,如果一旦开了空间,那么空间资料就只能对应一个QQ,这就是主表和从表的一对一关系了。

一对一关联主要应用的情况就是当许多的资料记录都是指向同一个事物,从逻辑或效率的考虑出发,将这些资料拆分成两个表(甚至更多),一一对应。如QQ和QQ空间的资料都指代QQ使用者,但是从逻辑上就把QQ和QQ空间的资料分开,以便更好的管理和更有效率的操作。

同时,一对一关联我们还有可能遇到一种比较特殊的情况,就是从从表的角度去关联主表。这种关联与主表关联从表是相同的,所以sp框架也把它归类到一对一关联中,使用的方法和一对一关联相同。

2、一对多的关联。一对多的情况就是主表上一条记录可以对应从表上多条记录(当然也可以对应零条),但是请注意,从表上的任何一条记录,只能对应主表的一条记录。如在PHP论坛中,一个用户可以发多个帖子,但任何一个帖子的发帖人只能是一个用户,这就是一对多的关联。

一对多关联比较强调从属的关系,如帖子就一定从属于发帖人,没有发帖人就没有这个帖子。
3、多对多的关联。与一对多关联有所不同的是,多对多关联就无法区分主表和从表,或者说两者都是从表。用QQ和QQ群来说,一个QQ用户可以加入多个QQ群,而一个QQ群也可以有很多的QQ成员,这就是多对多的关系。
多对多关联同时也存在一种特殊情况,就是事务的自身与自身之间的多对多关联;比如QQ用户之间,A可以拥有包括B在内的许多好友,而B也可以A作为好友同时还有其他的QQ好友。这在QQ用户之间形成了多对多的关系。在sp框架的处理中,这类自身的多对多关联也是归类到多对多的关联内。

以上我们了解了三类的关联,下面我们开始介绍sp框架中处理表间关联的spLinker类。

spLinker是spModel的附属类,为spModel 的继承类提供了表间关联的功能。


一对一关联 - hasone - find,findAll,findBy,create,update,delete,deleteByPk
多对多关联 - manytomany - find,findAll,findBy(需要建立中间表)

由于多对多关联涉及到了中间表,所以在spLinker中并没有对其create/update/delete进行支持。由此,下章开始将分别介绍这三种关联的实现。


2012-08-04 17:04:34