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

SQL Server松散耦合表-性能考虑因素?,sql,sql-server,database-design,relational-database,database-performance,Sql,Sql Server,Database Design,Relational Database,Database Performance,我正在从头开始为一个新的应用程序构建一个数据库模式,我的两个目标是松耦合(可伸缩性)和性能(但性能是最重要的)。我不确定在中心表中包含外键列是否是一个好主意。最好用一个例子来理解我的问题(请记住,这个例子纯粹是假设性的): 我们有一张桌子,让我们称这张桌子为“动物”。在这个表中,我们有几个条目可以定义数据库中存储的各种类型的“动物”的属性。 我们还有另一个名为“AnimalName”的表,其目的是将每种动物的名称与语言ID一起存储在“Animal”表中(因此我们有一个表,该表以每种语言存储“An

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

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

我有两种实现上述表格的方法:

第一条路 动物表:动物(PK)
AnimalName表:AnimalNameID(PK)、AnimalID(FK)、LanguageID(FK)、Name

查询如下所示:

从Animal a中选择*并在an.AnimalID=a.AnimalID和an.LanguageID=?其中a.AnimalID=?

第二条路 动物表:动物(PK),动物名称(FK)
AnimalName表:AnimalNameID(PK)、LanguageID(FK)、Name

查询如下所示:

SELECT*FROM Animal a JOIN AnimalName an ON.AnimalNameID=a.AnimalNameID和an.LanguageID=?其中a.AnimalID=?

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

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


非常感谢所有回答的人

第二种方法更好。AnimalName和Animal Name将具有一对多的关系,这在这里更有意义。

第一种方法为您提供了动物和AnimalName之间的标准一对多关系,允许每个动物有多个名称,这很有意义


使用第二种方法,每只动物只得到一个名字,而一个名字可以分配给许多动物,这是没有意义的。

只有第一种方法正确地模拟了您描述的问题:一只动物有许多名字,每种语言对应一个。第二种方法是按照动物的思路建模,它有一个名字,恰好是foo语言,与你的问题描述完全不同

对于您描述的这种查询,AnimalNames表必须按
(AnimalId,LanguageId)
进行唯一聚集,并将主键作为非聚集约束,或者更好地将
AnimalLanguageID
PK一起处理,并为
(AnimalId,LanguageId)
的复合PK建模

你也必须阅读