规范化/加入SQL Server表

时间:2011-02-21 13:01:31

标签: sql sql-server

我继承了一个没有规范化的SQL服务器数据库,让我很头疼。我在SQL方面不是很有经验,可能会提出愚蠢的问题,但对于如何推进以下方案表示感谢。

我有三张表如下: -

结果表:

**ResId    CompId     Name     Result**
  1        1          Band A   2
  2        1          Band B   1
  3        1          Band C   3
  4        2          Band A*  2
  5        2          Band B   1
  6        2          Band C   3

Bands当前名称表:

**BandId    BandName**
  1         Band A
  2         Band B
  3         Band C

以前称为乐队的名称表(在BandId上链接):

**oldBandId    BandId    oldBandName**
  1            1         Band A*
  2            1         Band a 
  2            2         Band b           

我希望合并结果表中的波段名称列表,用bandId替换波段名称,但结果表包含两个表中的波段名称。我应该创建一些连接表并将其用作结果表中的bandId?如果是这样我在这个连接表中需要什么,它只是bandId / oldBandId的psuedo-Id和连接的表名,然后将它放在结果表中?

然后我想使用查询来选择用户通过任何名称变体(新的或旧的)选择乐队的所有结果,并返回结果,包括与乐队链接的所有名称,即选择乐队A将返回结果乐队A和乐队A *。

提前致谢

史蒂夫

2 个答案:

答案 0 :(得分:2)

我喜欢在结果表中使用band id的想法。我建议删除“旧乐队名称”表并将其替换为乐队别名表,因为这听起来更像你想要的。 band别名表只有band id和每行一个别名。

答案 1 :(得分:1)

我认为你当前的数据库结构已经足够好 - 我想不出任何方法可以改进它,而不会让它进一步复杂化(特别是如果你想保留旧的波段名称)。

您可以根据需要编写查询 -

select * from results
where Name = @bandName or
      Name in (select oldBandName 
                from oldBands
                where BandId in (select BandId 
                                from Bands
                                where BandName = @bandName))