2011-01-20 30 views
0

虽然我使用的是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加入人表在查询中的所有其他表,那么这将仅仅是一个单一的加入,例如

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

但这意味着在我的模式中,人员表格连接到许多其他表格。除了复杂的模式图之外,有没有人看到这方面的缺点?

对于这个问题的任何评论 - 无论我现在正在做什么(多表连接)或第二个解决方案还是另一个没有发生在我身上的解决方案,都是最好的选择。

非常感谢提前

回答

3

那么,联接是数据库做的。话虽如此,您可以考虑在您的模型中传播自然键,然后您可以跳过连接中的某些表。看看this example

编辑

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

alt text

+0

我已经走了对于传播的外键方法,我更喜欢这种方式,因为虽然联接工作正常,但随着我更深入地了解架构,我可以看到它们变得更加复杂。我已经完成了几个成功的测试,并且它工作得很好 - 我已经在保存子模型之前传播外键的Rails模型上有回调,这意味着我的查询(例如注册)只需要执行一个加入。非常感谢您的回答! – 2011-01-23 19:48:47

相关问题