有没有理由不加入外键外键?

时间:2009-11-11 12:10:41

标签: sql sql-server database join

我有以下表格:

财务

  • PK_FinancialID
  • FK_SchoolID

学校

  • PK_SchoolID

  • PK_ClassID
  • FK_SchoolID
  • 类名

班级和金融都与学校有外键关系。我想创建一个查询,显示与符合特定条件的Financial行相关的所有类。

最初我认为构建查询如下:

Select Class.ClassName
From Class
Join School on Class.FK_SchoolID = School.PK_SchoolID
Join Financial on Financial.FK_SchoolID = Schol.PK_SchoolID
Where Financial ... -- define criteria

但是,由于Financial和Class都加入了PK_SchoolID列,因此应该可以按如下方式重写查询(删除School表并直接加入Class和Financial):

Select Class.ClassName
From Class
Join Financial on Financial.FK_SchoolID = Class.FK_SchoolID
Where Financial ... -- define criteria

从sql的角度来看,哪种方法更受欢迎?包含School表会使性能更好,因为引用了实际的PK记录(因此可以引用Clustered Index)吗?或者这不重要吗?我缺少什么?

平台:Sql Server 2005.所有表都正确声明和定义了它们的PK和FK列。

5 个答案:

答案 0 :(得分:3)

如果您不需要学校,请不要加入学校。如果您不希望此查询快速运行,请在Financial表的FK_SchoolID上创建索引。看起来你在Class-School-Financial之间有n-1-1关系,所以你甚至应该在Financial上创建唯一的索引。您不应该(在大多数情况下)添加额外的表来更快地进行查询,只需优化使用。

修改

如果您只选择ClassName,可能需要的是:

Select Class.ClassName
From Class
Where Exists 
    (select * from Financial 
    where (Financial.FK_SchoolID = Class.FK_SchoolID) and (...))

它可能比其他解决方案更快,更容易理解。

答案 1 :(得分:2)

是的,索引肯定会影响性能。

只需在Financial表中添加FK_SchoolID的索引,以便查询可以使用索引。

请注意,在表中添加或删除记录时,添加另一个索引会略微降低性能。查询表时获得的性能提升通常会超过这一点,但这就是为什么在添加索引时应该有点限制,而不仅仅是为所有字段添加索引。

答案 2 :(得分:1)

尝试以下方法:

Select Class.ClassName
From Class
Inner Join Financial on Financial.FK_SchoolID = Class.FK_SchoolID
Where Financial....yourcriteria

无需加入学校表。

答案 3 :(得分:1)

在我看来,你的两个例子都是错的。学校被列为金融学校并且学校提供课程这一事实并不意味着特定课程是金融课程 - 它可以是来自另一门课程的艺术课程。似乎这是整个模型的弱点,与您的SQL技术无关 - 或者我可能不理解底层模型和您可能具有的所有特殊约束。但是,这是一个类似模型的例子:

  • 一个学校可以提供许多课程;一些学校可以提供课程
  • 每个学校可能具有“通用”课程的特定名称和说明。
  • 一个证书 需要多个课程;许多证书可能需要课程

certification_model_01

答案 4 :(得分:0)

我会说你可以省去实际的学校桌子。看不出有什么不妥。

就性能而言:我不太确定,但我会说它会更快,因为你只有一张桌子可以加入 - 但我不是那个领域的专家......