Discussion about auto inner join or left join

Topics: Developer Forum
Sep 11, 2008 at 6:26 AM
Edited Sep 11, 2008 at 6:39 AM

As we know,
DBentry have a attribute called "lazyload",

I am not going to talk about lazyload,

on the contrary, I wanna talk about join table.

-----------------------------------------------

比如我定义了一个表,叫做Article,里面有这样几个BelongsTo的类型,Category, Member, 等等等等,他们是一对一的关系。

一般来说,我们想显示这些Article的时候,通常会选择用Join的查询方式来进行列表,这样的好处是用到Category信息的时候可以减少查询次数。

在DBentry中比如想显示Article里面第x~y条的数据,如果不定义JoinTable的话就不能进行Join查询。

如果这个表格里面有z个列,那么在定义JoinTable的时候就要把这些列重复写一遍,我觉得从某种程度上说很麻烦。当然这样的方式也有很大的扩展性。

我想,能否在BelongsTo属性里面面额外加一个属性(或者布尔值)叫做“是否自动Join”,“用什么join”的变量呢?就是在查询的时候是否自动Join。当然,还需要考虑如果joinID=0的状况,还有一些数据不存在的状况。

当然还有hasone。

只是提出一下。

我知道说起来容易实现起来确实很麻烦.

 我就在想能否先join一下,然后把相关的结果缓存在相关BelongsTo里面。

但是刚才想了一下,如果相关BelongsTo里面还有BelongsTo怎么办?恩,就不管他了。

 恩,貌似确实很麻烦,还不如直接定义JoinTable....

Coordinator
Sep 11, 2008 at 1:24 PM
呵呵,循环引用确实是比较讨厌的问题。

这种Join方式以前想过,确实比较麻烦一些。而且,虽然查询次数减少,速度却并不一定更快。
(ID方式的查询很容易就会在数据库缓存中,而Join的SQL却很容易造成全表查询,所以Join有可能快,也有可能更慢)

还是那句话,尽量简单设计,直到遇到性能问题之后,再考虑优化。

RoR实现了这种Join,以后如果有时间和精力的话,也许我也会实现吧。