首页 > 解决方案 > 约束自引用外键以限制嵌套(SQL、Sequelize)

问题描述

例如,我正在尝试制作一个包含以下结构的表:

<Comments>
id(PK, int)    comment_id(FK, int)    body(text)
1              null                   "This is a comment"
2              1                      "This is a nested comment"
3              2                      "This is a nested nested comment"

上面的例子代表了使用自引用表的优点——我想在一定程度上消除它。

注释的id: 3引用comment_id=2注释,而id=2引用comment_id=1

我想将此嵌套引用限制为单个级别,并能够添加一个特定的约束,该约束检查并建立一个等于第一级嵌套的值。

为了更清楚,id=3此时的而不是引用comment_id=2应该引用comment_id=1and 看起来像这样:

<Comments>
id(PK, int)    comment_id(FK, int)    body(text)
1              null                   "This is a comment"
2              1                      "This is a nested comment"
3              1                      "This is a nested nested comment"

我想让后端在处理这种情况时尽可能不忙,并且只需comment_id=2在我的创建查询中提供一个引用,我希望它自动指向它id=2的引用comment_id=1而不是comment_id=2

除了我在 NodeJS 中使用 Sequelize 并能够在后端路由中限制数据之外,我想了解如何使用 sql(或 sequelize)来实现这一点,以保持数据完整性流线性。

标签: sqlnode.jssequelize.jssequelize-cli

解决方案


您可以通过拥有另一张桌子来做到这一点。如果您的评论引用了某些东西,那么您可以使用该表。否则:

create table comments (
    commentId int primary key,
    . . .
);

create table commentLines (
    commentLineId int primary key,
    commentId int references comments(commentId),
    comment varchar(255)
);

推荐阅读