SQL Server松散耦合表-性能考虑因素?
我正在从头开始为一个新的应用程序构建一个数据库模式,我的两个目标是松耦合(可伸缩性)和性能(但性能是最重要的)。我不确定在中心表中包含外键列是否是一个好主意。最好用一个例子来理解我的问题(请记住,这个例子纯粹是假设性的): 我们有一张桌子,让我们称这张桌子为“动物”。在这个表中,我们有几个条目可以定义数据库中存储的各种类型的“动物”的属性。 我们还有另一个名为“AnimalName”的表,其目的是将每种动物的名称与语言ID一起存储在“Animal”表中(因此我们有一个表,该表以每种语言存储“Animal”表中每种动物的名称) 我有两种实现上述表格的方法: 第一条路 动物表:动物(PK)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表: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建模
你也必须阅读