a表字段id,shop_type,type_name 
id 是uniqueidentifier类型, 
shop_type是unique b表字段id,shop_type,shop_name 
id 是uniqueidentifier类型, 
shop_type是引用a表的一个键 现在做er图,shop_type指向a表的id好,还是指向a表的shop_type字段好?

解决方案 »

  1.   

    shop_type指向a表的id好  
    不行指向a表的shop_type字段
      

  2.   

    if object_id('comic') is not null
    drop table comic
    go
    if object_id('title') is not null
    drop table title
    gocreate table title(titleId int primary key,titleName varchar(50))
    insert into title select 1,'test'create table comic(titleId int not null,comicId int)
    insert into comic select 1,10
    insert into comic select 1,11alter table comic add constraint comic_conname
    foreign key(titleId) references title(titleId) on update cascade on delete cascadeupdate title set titleid=2 where titleid=1select * from comicdelete title where titleid=1titleId comicId
    2 10
    2 11外键是保证数据的完整性的,先看看概念,再看例子
      

  3.   

    shop_type指向a表的shop_type字段好
      

  4.   

    修改表结构
    a表字段id,shop_type,type_name 
    b表字段id,shop_type(这里改成aid),shop_name, 
    外键关系是 aid和A 表的ID关联
      

  5.   

    由于shop_type是unique 的,
    所以你a表中id列是多余的,
    最好是设计是这样.shop_type作为A表的主键
    a表
    shop_type,type_name 
    b表
    id,shop_type,shop_name这样shop_type就可以关联了,
      

  6.   

    谢谢大家的热情。
    不过我看过一些人的设计方法:主键不应该具有实际的意义,比如“订单编号”(ordercode)应该unique的,但是它在表中并不会做为主键,而是另起一个ID,为什么?当从表连接的时候,连ID好还是ordercode?
      

  7.   

    一般情况下都是使用一个表的主键来作为另一个表的外键。“订单编号”(ordercode)应该unique的,但是它在表中并不会做为主键,而是另起一个ID,为什么?当从表连接的时候,连ID好还是ordercode?这种情况就是为了避免并发情况下产生两个重复的编号,所以使用一个随即列来进行标志一个订单。使用那种个情况,根据自己的实际情况需要来进行,没有非要按照一定的模式来进行。不过最常用的还是第一种情况。
      

  8.   


    一般是连ID,ID作为主键就是为了别的表来把ID作为外键来定义,而ordercode只是保证业务逻辑不出错才定义成unique
      

  9.   

    但是我觉得连ID的话,操作SQL比较复杂。前台要条件查询(ordercode等,可能更多条件),后台非要转一次取的ID,然后再根据ID查找从表,当表中外键比较多的话,查询条件有比较复杂,不但操作麻烦,执行效率也没见得比连ordercode好多少?是不是?
      

  10.   

    如果是Order之类的,直接作为主键就可以了,
    这样减少数据的冗余,
    本来Order就是不允许重复的,
    即可作为主键,又可作为外键关联其它的表,
    不知道在这里面加一个ID有什么特别的意义,
    除了多些操作,多些处理外,真的看不出有什么好处来.不过我看过一些人的设计方法:主键不应该具有实际的意义,比如“订单编号”(ordercode)应该unique的,但是它在表中并不会做为主键,而是另起一个ID,为什么?当从表连接的时候,连ID好还是ordercode?
    --主键不应该有实际意义....
    这个是哪家的观点....
    不敢苟同.
      

  11.   

    仁兄,详情请移步
    http://www.cnitblog.com/sunnywang/archive/2007/12/03/37266.html
    下面节选:
    主键的无意义性: 
         我强调主键不应该具有实际的意义,这可能对于一些朋友来说不太认同,比如订单表吧,会有“订单编号”字段,而这个字段呢在业务实际中本身就是应该具有唯一性,具有唯一标识记录的功能,但我是不推荐采用订单编号字段作为主键的,因为具有实际意义的字段,具有“意义更改”的可能性,比如订单编号在刚开始的时候我们一切顺利,后来客户说“订单可以作废,并重新生成订单,而且订单号要保持原订单号一致”,这样原来的主键就面临危险了。因此,具有唯一性的实际字段也代表可以作为主键。因此,我推荐是新设一个字段专门用为主键,此主键本身在业务逻辑上不体现,不具有实际意义。而这种主键在一定程序增加了复杂度,所以要视实际系统的规模大小而定,对于小项目,以后扩展不会很大的话,也查允许用实际唯一的字段作主键的。  
      主键的选择 
         我们现在在思考一下,应该采用什么来作表的主键比较合理,申明一下,主键的设计没有一个定论,各人有各人的方法,哪怕同一个,在不同的项目中,也会采用不同的主键设计原则。