将一个表中的多个外键定义到多个表中

我有3个模型:

发布

  • ID
  • 标题
  • 身体
  • 照片

  • ID
  • 文件路径
  • 评论

  • ID
  • POST_ID
  • 身体
  • 和DB中的对应表。 现在,如果我只想为我的帖子发表评论,我可以简单地添加以下外键: ALTER TABLE comment ADD FOREIGN KEY (post_id) REFERENCES post (id) 。 但我想对其他模型(照片,简介,视频等)发表评论,并将所有评论保留在一张表中。 在这种情况下如何定义外键(我肯定需要ORM的FK)?


    你可以这样做:

     post:
      * post_id (PK)
      * title
      * body
    
     photo:
      * photo_id (PK)
      * filepath
    
     comment:
      * comment_id (PK)
      * body
    
     comment_to_post
      * comment_id (PK) -> FK to comment.comment_id
      * post_id (PK) -> FK to post.post_id
    
     comment_to_photo
      * comment_id (PK) -> FK to comment.comment_id
      * photo_id (PK) -> FK to photo.photo_id
    

    仍有可能发表属于两个不同项目的评论。 如果你认为这会是一个问题,我可以尝试改进设计。


    找到一些共同的职位,配置文件等 - 我用Entity缺乏更好的单词,然后子类型。

  • 在这个模型中,一个实体可以有很多评论,一个评论只属于一个实体。

  • 如果你想知道你是否可以将多个外键添加到单个列中,那么答案就是你不能。

    如果你愿意,你可以有单独的外键。 所以你可以像这样修改你的评论表 -

     comment:
      * comment_id (PK)
      * PostID (FK to Post.PostID)
      * PhotoID (FK to <Photo>.PhotoID)
      * ProfileID (FK to <Profile>.ProfileID)
      * Body
    

    而且,您必须确保您在Comment表中允许PostID,PhotoID和ProfileID列中的空值,并且也可以将默认值设置为null。

    这是DDL实现这一目标 -

    Create table Photo
    (
    PhotoID int,
    PhotoDesc varchar(10),
    Primary key (PhotoID)
    )
    
    Create table Post
    (
    PostID int,
    PostDesc varchar(10),
    Primary key (PostID)
    )
    
    Create table Profiles
    (
    ProfileId int,
    ProfileDesc varchar(10),
    Primary key (ProfileId)
    )
    
    Create table Comment  
    (
    CommentID int,
    PhotoID int,
    PostID int,
    ProfileId int,
    body varchar(10),
    Primary key (CommentID),
    Foreign key (PhotoID) references Photo(PhotoID),
    Foreign key (PostID) references Post(PostID),
    Foreign key (ProfileId) references Profiles(ProfileId)
    )
    
    insert into Photo values (1,'Photo1')
    insert into Photo values (2,'Photo2')
    insert into Photo values (3,'Photo3')
    
    insert into Post values (11,'Post1')
    insert into Post values (12,'Post2')
    insert into Post values (13,'Post3')
    
    insert into Profiles values (111,'Profiles1')
    insert into Profiles values (112,'Profiles2')
    insert into Profiles values (113,'Profiles3')
    
    insert into Comment (CommentID,PhotoID,body) values (21,1,'comment1')
    insert into Comment (CommentID,PhotoID,body) values (22,3,'comment2')
    insert into Comment (CommentID,PostID,body) values (23,11,'comment3')
    insert into Comment (CommentID,PostID,body) values (24,12,'comment4')
    insert into Comment (CommentID,ProfileId,body) values (25,112,'comment5')
    insert into Comment (CommentID,ProfileId,body) values (26,113,'comment6')
    
    -- to select comments seperately for Photos, profiles and posts
    select * from Comment where PhotoID is not null
    select * from Comment where ProfileId is not null
    select * from Comment where PostID is not null
    
    链接地址: http://www.djcxy.com/p/70617.html

    上一篇: Defining multiple foreign keys in one table to many tables

    下一篇: Conditional Foreign Key Constraints