Eln*_*mov 7 database database-design foreign-keys
我正在创建一个社交网络.它有几个实体,如新闻,照片,可以有评论.由于所有注释都具有相同的列并且行为方式相同,唯一的区别是它们的类型 - 新闻,照片或将来要添加的其他内容 - 我决定使用名为列的所有注释创建一个表type
.它工作得很好,直到我决定将外键添加到我的数据库模式.
该comment
表具有一个柱parent
,它是指id
的news
或photo
表,这取决于塔type
.
问题是,我不能添加一个引用未知表的外键,甚至更多,它一次引用几个表.
整个数据库现在使用外键,除了表parent
中的这一列comment
.它困扰我,因为它是我无法添加外键的唯一地方.
我敢肯定我不能创造这样的外键; 我的数据库设计中的某些东西需要改变.我决定创建一个评论表,准备为将来的新实体添加新的评论类型 - 视频,音乐,文章等 - 当我想为所有评论添加一个新列时,不要遇到维护地狱.
如果我必须为每个注释类型创建一个单独的表,以便能够完全使用外键,我会这样做.但也许这个问题的另一个常见解决方案已经存在,我只是不知道它?
也许我应该创建某种链接表,将comment
表与其他实体的表链接起来?但也许这个解决方案比为每个评论类型创建一个单独的表更复杂?
也许我应该在comment
表中有几列,比如newsId
,photoId
我可以添加外键吗?
这些解决方案对我来说似乎并不优雅,或者我只是误解了一些东西.我对这个问题的全部看法可能是完全错误的.这就是我在这里的原因.请分享您的想法.
我认为你的问题是你有几个实体 - 新闻,照片.但这些都只是(比方说)项目的类型.与评论一样,项目可能具有一些共同的属性以及一些不同的属性.其中一个属性是被评论的能力.
在这种方法中,您有一个表CommentableItems
(1),具有共同的属性.然后你有一些子表NewsItems
,PhotoItems
等等.很容易设置这些表的键来强制执行所需的一对一关系.显然,Comments有一个引用的外键CommentableItems
.
(1) 实际上我可能会拍摄自己,而不是允许一个叫做某事物的表格像CommentableItems
我的模式一样可怕,但这只是为了举例.