在一个表中定义多个外键到许多表

我有3个模型:

post

  • ID
  • 标题
  • 身体

照片

  • ID
  • 文件path

评论

  • ID
  • POST_ID
  • 身体

和DB中的对应表。 现在,如果我只想为我的post发表评论,我可以简单地添加以下外键: ALTER TABLE comment ADD FOREIGN KEY (post_id) REFERENCES post (id) 。 但我想对其他模型(照片,简介,video等)的意见,并保留在一个表中的所有意见。 在这种情况下如何定义外键(我肯定需要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 

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

find一些共同的职位,configuration文件等 – 我已经用Entity缺乏更好的单词,然后子types。

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

替代文字

如果你想知道如果你可以有多个外键到一个列,那么答案是你不能。

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

  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 

在这种情况下,您可以添加一个ENUM字段,其中将包含“照片”,“configuration文件”…这将是外键的第二部分

由于照片评论与发表评论不一样,所以我会将它们存储在单独的相关表格中。 所以我会有:

post:

  • postID
  • 标题
  • 身体

发表评论:

  • Commentid
  • post_id正文

照片:

  • PHOTOID
  • 文件path

PhotoComment:

  • Commentid
  • photo_id
  • 身体

使用id作为你的PK的名字是一个不好的做法,这使得报告更难,更可能无意中join错误的表中一个复杂的查询。 如果您使用tablenameID并始终使用相同的名称作为FKS,则更容易看到关系。