1

这是我的第一个问题,所以我会非常彻底。忍受我。

我正在为啤酒建立一个数据库,并创建了一个链接表,允许我推荐类似的啤酒(根据口味或其他质量)。原始表使用 beerID 作为主键,在链接表中,我通过两次加载 beerID 从外键 beerID1 和 beerID2 创建了一个复合主键。到目前为止它运行良好,除了当我选择:

beerID1 = Dechutes IPA,beerID2 = Rogue IPA

-然后在另一排-

beerID1 = Rogue IPA,beerID2 = Dechutes IPA

正如您所看到的,我遇到了重复数据的问题,而且我对 SQL 不太熟悉,无法深入了解如何解决这个问题。外行可以使用的任何想法?我正在考虑某种形式的验证或查询……但似乎无法走得太远。

4

1 回答 1

0

你实际上想把它标准化一点。查看http://en.wikipedia.org/wiki/First_normal_form

我认为你正在做的是:

Beer
BeerID  BeerName  BeerManufacturer
------  --------  ----------------
1       Beer1     Brewer 1
2       Beer2     Brewer 1
3       Beer3     Brewer 2
4       Beer4     Brewer 3

AltBeer
AltBeerID  BeerID  BeerID1  BeerID2  BeerID3
---------  ------  -------  -------  -------
1          1       3        4
2          2       5
3          4       7

相反,您希望只有一列用于替代啤酒。在这种情况下,AltBeer 变为

AltBeer
AltBeerID  BeerID  AltBeer
---------  ------  -------
1          1       3        
1          1       4        
2          2       5
3          4       7

然后在 Beer 和 AltBeer 上进行连接(基于 BeerID)将为您提供与原始啤酒相似的 BeersID 列表。您可以通过再次加入 Beer 来查看备用啤酒的详细信息(基于 BeerID 和 AltBeer)

SELECT beer.beermanufacturer,
       beer.beername,
       beer_1.beername         AS recbeer,
       beer_1.beermanufacturer AS recbeerman
FROM   (altbeer
       INNER JOIN beer
         ON altbeer.beerid = beer.beerid)
       INNER JOIN beer AS beer_1
         ON altbeer.altbeer = beer_1.beerid;  

结果是这样的(没有重复,保证)

BeerName    BeerManufacturer   RecBeer     RecBeerMan
--------    ----------------   -------     -----------
Beer1       BeerMan1           Beer3       BeerMan2
Beer1       BeerMan1           Beer4       BeerMan3

(当然,如果我们正确地规范了这一切,我们还将 Beer Manufacturer 拆分到自己的表中,因为啤酒和制造商之间存在多对一的关系。)

于 2011-06-02T15:34:19.130 回答