如何设计数据库模式以通过许多其他表链接两个表

时间:2011-01-20 16:01:59

标签: sql ruby-on-rails database-design optimization

虽然我正在使用Rails,但这个问题更多的是关于数据库设计。我的数据库中有几个实体,其架构有点像这样:http://fishwebby.posterous.com/40423840

如果我想获得一份人员名单并按姓氏订购,那就没问题了。但是,如果我想获得一个按姓氏排序的人员列表,注册一个特定的组,我必须使用一个SQL语句,其中包括四个表中的几个连接,如下所示:

SELECT group_enrolment.*, person.*
FROM person INNER JOIN member ON person.id = member.person_id
INNER JOIN enrolment ON member.id = enrolment.member_id
INNER JOIN group_enrolment ON enrolment.id = group_enrolment.enrolment_id
WHERE group_enrolment.id = 123
ORDER BY person.surname;

虽然这有效,但它让我觉得有点低效,而且随着我的架构的增长,这些查询会变得越来越复杂。

另一种选择可能是通过在其他表中包含person_id将person表连接到查询中的所有其他表,然后它只是一个连接,例如

SELECT group_enrolment.*, person.*
FROM person INNER JOIN group_enrolment ON group_enrolment.person_id
WHERE group_enrolment.id = 123
ORDER BY person.surname;

但这意味着在我的架构中,person表与很多其他表连接在一起。除了复杂的架构图,有没有人看到这个有什么缺点?

我非常感谢对此的任何评论 - 我现在正在做什么(许多表加入)或第二个解决方案或另一个没有发生的解决方案是最好的方法。< / p>

非常感谢提前

1 个答案:

答案 0 :(得分:3)

好吧,连接是数据库的功能。话虽如此,您可以考虑在模型中传播自然键,这样可以跳过连接中的某些表。看看this example

修改

我不是说这会匹配你的模型(问题),但只是为了好玩,尝试类似的问题:

alt text