SQL Server 松散耦合表 - 性能考虑因素?

Rus*_*lan 1 sql sql-server database-design relational-database database-performance

我正在从头开始为新应用程序构建数据库模式,我的两个目标是松耦合(可扩展性)和性能(但性能是最重要的)。我不确定在中央表中包含外键列是否是一个好主意。使用示例可能可以最好地理解我的问题(请记住,这个示例纯粹是假设的):

我们有一张桌子,我们称这张桌子为“动物”。在此表中,我们有几个条目可以定义数据库中存储的各种类型的“动物”的属性。我们还有另一个名为“AnimalName”的表,其目的是将“Animal”表中每个动物的名称与语言 ID 一起存储(因此我们有一个表将每个动物的名称存储在“Animal”表中)每种语言的动物”表)。

我有两种方法来实现上表:

第一种方式

动物表:AnimalID (PK)
AnimalName 表:AnimalNameID (PK)、AnimalID (FK)、LanguageID (FK)、Name

查询将如下所示:

SELECT * FROM Animal a JOIN AnimalName an ON an.AnimalID = a.AnimalID and an.LanguageID = ? WHERE a.AnimalID = ?

第二种方式

动物表:AnimalID (PK)、AnimalNameID (FK)
AnimalName 表:AnimalNameID (PK)、LanguageID (FK)、Name

查询将如下所示:

SELECT * FROM Animal a JOIN AnimalName an ON an.AnimalNameID = a.AnimalNameID and an.LanguageID = ? WHERE a.AnimalID = ?

对于第二种方式,如果我要向 AnimalName 表添加“AnimalID”FK 列,那么它也将支持以第一种方式表达的查询。

上述哪一种方法将提供最快的性能(这一点至关重要!)?根据您的经验,您通常会推荐上述哪一种方法?

预先非常感谢所有回答的人!

Rem*_*anu 5

只有第一种方法可以正确地模拟您所描述的问题:动物有很多名称,每种语言都有一个名称。第二种方法是按照动物的方式建模,该动物有一个名称,该名称恰好采用语言 foo,这与您的问题描述完全不同。

对于您所描述的这种类型的查询,AnimalNames 表必须唯一地聚集并且(AnimalId, LanguageId)将主键作为非聚集约束,或者甚至更好地AnimalLanguageID完全处理 PK 并对 的复合 PK 进行建模(AnimalID, LanguageID)

您还必须阅读设计索引