
CREATE TABLE identity (
    identity_id        INT PRIMARY KEY AUTO_INCREMENT,
    network_id         INT NOT NULL,
    -- 业务侧来源
    subject_type       ENUM('token', 'instance', 'user', 'service') NOT NULL,
    subject_id         VARCHAR(128) NOT NULL,

    created_at         INT(10) NOT NULL DEFAULT 0,
    expired_at         INT(10) NOT NULL DEFAULT 0,

    UNIQUE KEY uk_subject (network_id, subject_type, subject_id)
);

-- policy 表（权限集合，可复用）
CREATE TABLE policy (
    policy_id      INT PRIMARY KEY AUTO_INCREMENT,
    network_id     INT NOT NULL,
    name           VARCHAR(64) NOT NULL,
    description    VARCHAR(255),
    created_at     INT(10) NOT NULL DEFAULT 0
);

-- identity_policy（多对多关系）
CREATE TABLE identity_policy (
    identity_id    INT NOT NULL,
    policy_id      INT NOT NULL,
    PRIMARY KEY (identity_id, policy_id)
);

CREATE TABLE rule (
    rule_id  INT PRIMARY KEY AUTO_INCREMENT,
    network_id  INT NOT NULL,
    -- 来源限制（可选）
    src_policy_id   INT NOT NULL,
    -- 目标限制（可选，允许 NULL 表示 any）
    dst_policy_id   INT NULL,
    -- 6=TCP, 17=UDP
    proto       TINYINT NOT NULL,
    -- 0~65535
    port        INT NOT NULL,
    action      ENUM('allow', 'deny') NOT NULL,
    created_at  INT(10) NOT NULL DEFAULT 0,
    INDEX idx_src (src_policy_id),
    INDEX idx_dst (dst_policy_id)
);

-- 实际操作逻辑
-- 1. 通过Token获取user+password的方式找到对应的identity_id，每个端都会有一个对应的identity_id值
-- 2. 数据访问的时候SDLData结构会携带一个identity_id, 被访问端会先查找自身的cache是否有对应identity_id(src_identity_id)的规则


-- 难点
-- 通过src_identity_id, dst_identity_id 查找到对应的rules

-- 查找来源对应的rules
-- $src_policy_ids = select * from identity_policy where identity_id = $src_identity_id
-- $drt_policy_ids = select * from identity_policy where identity_id = $dst_identity_id

-- 来源 src_policy_id 可以是Any (UNION {0})；目标 dst_policy_id不能是Any
-- select * from rule where src_policy_id in ($src_policy_ids UNION {0}) and dst_policy_id in $drt_policy_ids

-- 然后合并全部的rules

