博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

数据库知识点滴(2)--多对多问题的解决

Posted on 2009-09-14 10:57  一刻  阅读(240)  评论(0)    收藏  举报
1.怎么把多对多关系的表转化成一对一,通过增加一个中间表就可以完成。
   我们举个例子:现在我们有  笔类分为红笔,黑笔,蓝笔。那么有商品呢若干,我的商品中有单色笔,比如只是红色,黑色或者蓝色的。当然我们的商品中也存在多色笔,比如双色笔红色和蓝色搭配,黑色和蓝色搭配等,三色笔也有。那么显然笔类和商品之间就有一种多对多的关系,即我红笔类可能对应很多笔,那么我每支笔的可能对应几个类,比如我双色笔就可能对应红色和黑色等。那么对于这种多对多关系的表我们增加中间表ClassProduct。ClassProduct表两个字段,一个字段为ClassID,另外一个为ProductID对这两个字段建立联合主键,那么就可以消除在表ClassProduct中记录相同的情况,同时我们通过外键把这个表跟Class表和Product表建立关联。以Class表的ClassID为主键,ClassProduct 表的ClassID为外键建立关系,同时,以Product表的ProductID为主键,ProductID为外键建立主外键关联。
    代码如下:create database ShopPen
                      go
                     create table Class
                     (ClassID  int   not null primary key identity(1,1) ,
                       ClassName nvarchar(50) not null)
                    go
                    create table Product
                    (ProductID int not null primary key  identity(1,1),
                     Price money,
                     Description nvarchar(max) ,
                     Number int   )
                   create table ClassProduct
                     (ClassID  int  not  null  foreign key references Class(ClassID) on update cascade,
                       ProductID int not null  foreign key references Product(ProductID) on update cascade primary key(ClassID,ProductID))
                       --  on update cascade是更新级联,在我2005的数据库好象叫做层叠,它的作用是如果主表的记录修改,从表跟着修改 。primary key(ClassID,ProductID)定义联合主键。现在我们已经成功地将多对多的关系拆成了一对多(Class表和ClassProduct)和多对一的关系(ClassProduct和Product)   
现在往表中插入一些数据吧Class表
                 insert into Class (ClassName) values ('Red')
                 insert into Class (ClassName) values ('Black')
                 insert into Class (ClassName) values ('Blue')
Product 表
                insert into Product  (Price,Number,Description) values(3,50,'This is the best for Children')
                insert into Product  (Price,Number,Description) values(2,150,'This is the best for old peole')
                insert into Product  (Price,Number,Description) values(10,120,'This is the best for your wife')
                insert into Product  (Price,Number,Description) values(1,30,'This is good for Children')
                insert into Product  (Price,Number,Description) values(6,50,'This is the best for your son')
                insert into Product  (Price,Number,Description) values(20,130,'This is the best for your  girl friend')
                insert into Product  (Price,Number,Description) values(3,50,'It is pretty')
                insert into Product  (Price,Number,Description) values(3,50,'It is useful')
                insert into Product  (Price,Number,Description) values(1.5,80,'It is good for your health')
                insert into Product  (Price,Number,Description) values(3,32'It is for the old peopel')
                insert into Product  (Price,Number,Description) values(6,45,'That is good')
                insert into Product  (Price,Number,Description) values(2,40,'The end one')
ClassProduct表
              insert into ClassProduct(ClassID,ProductID) values (1,1)
              insert into ClassProduct(ClassID,ProductID) values (1,2)
              insert into ClassProduct(ClassID,ProductID) values (1,3)
              insert into ClassProduct(ClassID,ProductID) values (1,6)
              insert into ClassProduct(ClassID,ProductID) values (1,8)
              insert into ClassProduct(ClassID,ProductID) values (1,12)
              insert into ClassProduct(ClassID,ProductID) values (2,4)
              insert into ClassProduct(ClassID,ProductID) values (2,5)
             insert into ClassProduct(ClassID,ProductID) values (2,6)
              insert into ClassProduct(ClassID,ProductID) values (2,7)
             insert into ClassProduct(ClassID,ProductID) values (2,9)
             insert into ClassProduct(ClassID,ProductID) values (2,10)
               insert into ClassProduct(ClassID,ProductID) values (3,1)
              insert into ClassProduct(ClassID,ProductID) values (3,3)
               insert into ClassProduct(ClassID,ProductID) values (3,11)
               insert into ClassProduct(ClassID,ProductID) values (3,8)
              insert into ClassProduct(ClassID,ProductID) values (3,7)
ok,表间关系搞定了,下一步是关于查询的问题