在一个表中定义多个外键指向多个表
在一个表中定义多个外键指向多个表
我有3个模型:
帖子(Post):
- id
- 标题(title)
- 内容(body)
照片(Photo):
- id
- 文件路径(filepath)
评论(Comment):
- id
- 帖子id(post_id)
- 内容(body)
并在数据库中对应有相应的表。现在,如果我只想针对我的帖子有评论,我可以简单地添加以下外键:ALTER TABLE comment ADD FOREIGN KEY (post_id) REFERENCES post (id)
。但是我想为其他模型(照片、个人资料、视频等)添加评论,并将所有评论保存在一个表中。在这种情况下,我如何定义外键(对于ORM我肯定需要外键)?
在上述内容中,某些情况下了将多个外键定义在一个表中,并且这些外键指向多个表的问题。他们讨论了这个问题出现的原因以及解决方法。根据他们的讨论,这个问题出现的原因是可能存在一个评论属于多个不同的项的情况。为了解决这个问题,他们提出了一种解决方案,即使用多个表来表示多个实体,并且使用级联规则来确保数据的一致性。他们还讨论了如何改进设计,以防止一个评论同时属于多个项的情况。最后,他们提出了两种可能的解决方案,一种是限制只能有一个外键指向主键,另一种是不允许在一组表中有多个外键值。通过这些讨论,我们可以得出结论,解决这个问题的方法是使用多个表来表示多个实体,并且使用级联规则来确保数据的一致性,同时可以根据具体需求来采取限制外键的策略。
在一个表中定义多个外键指向多个表的原因是,有时候我们希望将所有的评论存储在一个表中。然而,这种做法是不规范的,并且会导致性能问题。如果我们允许在外键字段中使用NULL值,那么可以实现这种需求。但是,这种做法在ANSI SQL数据库中是不可能的。因此,我们需要找到一种规范化的解决方案来解决这个问题。
解决方法是将评论表分解为多个表,每个表都只与一个外键关联。这样可以避免不规范和性能问题。以下是一个示例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) )
通过将评论表分解为多个表,每个表都只包含一个外键,我们解决了多个外键指向一个表的问题。这种规范化的解决方案不仅避免了不规范和性能问题,还提高了数据库的可维护性和查询效率。
请注意,在这个解决方案中,我们仍然要允许在外键字段中使用NULL值。这可以通过在评论表的外键字段中允许NULL值,并将默认值设置为NULL来实现。这样,即使评论没有与照片、帖子或个人资料相关联,我们仍然可以将评论存储在评论表中。
总结起来,通过将评论表分解为多个表,每个表都只与一个外键关联,我们解决了多个外键指向一个表的问题,并避免了不规范和性能问题。这种规范化的解决方案提高了数据库的可维护性和查询效率。
在这个问题中,出现的原因是有多个不同的实体(post、profile等)与评论(comment)相关联。解决方法是创建一个超类(supertype)来包含所有实体的共同属性,并使用外键关联多个表。
具体的解决方案如下:
1. 创建一个超类(Entity)来包含所有实体的共同属性。这个超类只包含一个EntityId列。
2. 在每个实体表中,定义一个外键(entityId)来引用超类的EntityId列。
3. 这样,每个实体表都可以与评论表(comments)建立一对多的关系。每个评论只属于一个实体。
4. 如果需要限制评论只能与特定的实体相关联,可以在评论表中添加外键(entityId)来引用实体表的EntityId列。这样就可以确保评论只能与特定的实体关联。
通过使用超类和外键,可以解决在一个表中定义多个外键引用多个表的问题。这种设计技术可以提高数据模型的灵活性和可扩展性,同时确保数据的完整性和一致性。