You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Schema约束:每个程序仅关联每个分类下的一个标签

解决方案

要实现每个程序在同一分类下仅关联一个标签的约束,无需触发器,只需调整program_tag表的结构,通过添加字段和约束即可实现:

修改后的完整Schema

CREATE TABLE categories (
    id INT PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY,
    name TEXT NOT NULL
);

CREATE TABLE tags (
    id INT PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY,
    name TEXT NOT NULL,
    category_id INT NOT NULL,
    CONSTRAINT fk_category FOREIGN KEY(category_id) REFERENCES categories(id),
    -- 可选:确保同一分类下标签名唯一
    UNIQUE (category_id, name)
);

CREATE TABLE programs (
    id INT PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY,
    name TEXT NOT NULL,
    description TEXT NOT NULL,
    image TEXT NOT NULL
);

CREATE TABLE program_tag (
    program_id INT NOT NULL,
    tag_id INT NOT NULL,
    category_id INT NOT NULL,
    PRIMARY KEY (program_id, tag_id),
    -- 约束1:每个程序+分类只能有一条关联记录
    UNIQUE (program_id, category_id),
    -- 约束2:关联的标签必须属于指定的分类
    CONSTRAINT fk_tag_category FOREIGN KEY(tag_id, category_id) REFERENCES tags(id, category_id),
    CONSTRAINT fk_program FOREIGN KEY(program_id) REFERENCES programs(id)
);

关键约束说明

  • UNIQUE (program_id, category_id):直接限制同一个程序无法在同一个分类下关联多个标签,确保每个分类对每个程序仅存一条关联记录。
  • 复合外键fk_tag_category:保证program_tag中的category_id必须和tag_id所属的分类一致,避免出现标签与分类不匹配的情况。由于tags表中每个tag_id对应唯一的category_id,这个复合外键会自动验证两者的对应关系。

补充说明

如果需要强化业务规则,确保同一分类下的标签名称不重复,可以给tags表添加UNIQUE (category_id, name)约束,这属于可选的优化项,不影响核心需求的实现。

内容的提问来源于stack exchange,提问作者Pehr Sibusiso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:39:54