我有一个评论系统,用户可以在其中评论各种不同类型的页面。每种页面类型(例如评论)都有自己的表格,其中包含GROUP BY
列。在我的评论表中,我有id
和page_type
,它们引用了网页的类型和相应表格的page_id
列。
我希望根据id
在page_id
列上设置外键约束,以便在页面ID更改或页面被删除时,注释将更新。我知道单列上不可能这样做,但最好的解决办法是什么呢?
我可以为每个页面类型添加一个列,该列将引用特定表中的ID并对其进行外键约束,但随着页面类型数量开始增长(目前有4个),这可能会变得混乱。
答案 0 :(得分:0)
MySQL不支持派生列上的外键引用(没有派生列)。
所以,我会说,如果你需要一个外键引用某些东西,那么“某事”就是一个实体。这应该是参考的地方。考虑这样的结构:
create table pages (
PageId int not null autoincrement primary key,
<additional columns common to all pages>
);
然后每个特定的页面类型可以是:
create table PagesType1 (
PageType1Id int not null autoincrement primary key,
PageId int not null,
foreign key PageId references pages(PageId)
)
这并不完美,因为两种不同的页面类型可以引用回同一页面。但是,没有触发器,这对MySQL来说非常好。另一种解决方案是:
create table pages (
PageId int not null autoincrement primary key,
<additional columns common to all pages>,
PageType1Id int unique,
PageType2Id int unique,
. . .
foreign key (PageType1Id) references PagesType1(PageType1Id),
. . .
);
这正确地获取了外键关系。但是,您需要一个触发器来保证只设置一个值。
无论如何,这个答案的要点是你的数据库中需要一个Pages
实体。有多种方法可以实现它。