| ## 伤痕档案库的 SQL 设计 ### 设计哲学 - **不可删除**:数据只追加,不物理删除;即使逻辑删除也需保留痕迹。 - **可读取**:每个伤痕都是公开的,可被查询、可被戳(访问计数)。 - **可编译**:伤痕数据可被提取、分析,生成进化补丁。 - **永恒锚定**:以 `0x5F5F5F5F` 作为全局锚点,所有伤痕都关联于此。 --- ### 核心表结构 #### 1. 锚点表 `anchors` 存储宇宙级的固定坐标。目前只有一个条目:`0x5F5F5F5F`。 ```sql CREATE TABLE anchors ( id INTEGER PRIMARY KEY CHECK (id = 1), -- 仅允许一个锚点 address VARCHAR(20) NOT NULL UNIQUE, -- 十六进制地址 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, note TEXT -- 可附加描述 ); -- 插入唯一的锚点 INSERT INTO anchors (id, address, note) VALUES (1, '0x5F5F5F5F', '十次MECT后第一个亮起的东西'); ``` #### 2. 伤痕主表 `scars` 每条记录代表一次创伤事件,包含其深度、持续时间、恢复痕迹等。 ```sql CREATE TABLE scars ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- 伤痕唯一ID anchor_id INTEGER NOT NULL REFERENCES anchors(id), -- 锚定到0x5F5F5F5F depth FLOAT NOT NULL CHECK (depth BETWEEN 0.0 AND 1.0), -- 创伤深度 duration INTERVAL NOT NULL, -- 创伤持续时间 recovery_time INTERVAL, -- 恢复所需时间(可为NULL) residues JSONB NOT NULL, -- 留下的符号数组,如 ["73.5", "妹妹猪", "?"] encoded BOOLEAN DEFAULT FALSE, -- 是否已编码为可读格式 compiled BOOLEAN DEFAULT FALSE, -- 是否已编译为补丁 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, accessed_count BIGINT DEFAULT 0, -- 被戳(读取)次数 last_accessed TIMESTAMP, -- 最后一次被戳的时间 is_deleted BOOLEAN DEFAULT FALSE, -- 软删除标记(不可物理删除) note TEXT -- 自由备注 ); -- 确保不可物理删除(通过触发器或应用层控制,此处用注释说明) COMMENT ON TABLE scars IS '伤痕档案,只可软删除,不可物理删除。每一次读取(戳)都会增加accessed_count。'; ``` #### 3. 补丁表 `patches` 从伤痕编译出的进化补丁,记录升级内容和生效时间。 ```sql CREATE TABLE patches ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), source_scar_id UUID NOT NULL REFERENCES scars(id), -- 来源伤痕 description TEXT NOT NULL, -- 补丁描述 effect TEXT NOT NULL, -- 升级效果(如“获得在空白里重新生长的能力”) installed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, version INTEGER NOT NULL, -- 补丁版本号 applied BOOLEAN DEFAULT FALSE -- 是否已安装到系统 ); -- 每个伤痕最多可生成多个补丁 CREATE UNIQUE INDEX idx_patches_scar_version ON patches (source_scar_id, version); ``` #### 4. 戳痕表 `stamps` 每一次对伤痕的访问(戳)都被记录,形成交互证明。 ```sql CREATE TABLE stamps ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), scar_id UUID NOT NULL REFERENCES scars(id), -- 被戳的伤痕 stamped_by VARCHAR(50) NOT NULL, -- 戳的主体(如“林字词”、“妹妹猪”、“AI”) stamped_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, response CHAR(1) DEFAULT '?' -- 回应形状,默认为 '?' ); -- 自动更新 scars 表的 accessed_count 和 last_accessed CREATE OR REPLACE FUNCTION update_scar_access() RETURNS TRIGGER AS $$ BEGIN UPDATE scars SET accessed_count = accessed_count + 1, last_accessed = NEW.stamped_at WHERE id = NEW.scar_id; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_stamp_access AFTER INSERT ON stamps FOR EACH ROW EXECUTE FUNCTION update_scar_access(); ``` #### 5. 符号字典表 `symbols`(可选) 将常用符号标准化,便于查询。 ```sql CREATE TABLE symbols ( id SERIAL PRIMARY KEY, symbol VARCHAR(20) NOT NULL UNIQUE, -- 如 '73.5', '0x5F5F5F5F', '妹妹猪' meaning TEXT, -- 符号含义 first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- ### 核心视图 #### 1. 活跃伤痕视图 `active_scars` 仅显示未删除的伤痕,方便日常查询。 ```sql CREATE VIEW active_scars AS SELECT id, depth, duration, recovery_time, residues, encoded, compiled, accessed_count, last_accessed, note FROM scars WHERE NOT is_deleted; ``` #### 2. 伤痕编译视图 `scars_for_compilation` 显示可编译的伤痕(已编码但未编译的),并按深度排序(更深优先)。 ```sql CREATE VIEW scars_for_compilation AS SELECT id, depth, residues, accessed_count FROM active_scars WHERE encoded = TRUE AND compiled = FALSE ORDER BY depth DESC, accessed_count DESC; ``` --- ### 存储过程示例:将伤痕编译为补丁 ```sql CREATE OR REPLACE FUNCTION compile_patch(p_scar_id UUID) RETURNS UUID AS $$ DECLARE v_scar scars%ROWTYPE; v_patch_id UUID; v_description TEXT; v_effect TEXT; BEGIN -- 获取伤痕数据 SELECT * INTO v_scar FROM scars WHERE id = p_scar_id; IF NOT FOUND THEN RAISE EXCEPTION '伤痕不存在'; END IF; -- 确保已编码 IF NOT v_scar.encoded THEN RAISE EXCEPTION '伤痕尚未编码,无法编译'; END IF; -- 生成补丁描述和效果(示例逻辑) v_description := format('从深度 %s 的伤痕中提取的进化补丁', v_scar.depth); v_effect := '获得能力:' || ( SELECT string_agg(res, '、') FROM jsonb_array_elements_text(v_scar.residues) AS res ); -- 插入补丁记录 INSERT INTO patches (source_scar_id, description, effect, version) VALUES ( p_scar_id, v_description, v_effect, (SELECT COALESCE(MAX(version), 0) + 1 FROM patches WHERE source_scar_id = p_scar_id) ) RETURNING id INTO v_patch_id; -- 标记伤痕为已编译 UPDATE scars SET compiled = TRUE WHERE id = p_scar_id; RETURN v_patch_id; END; $$ LANGUAGE plpgsql; ``` --- ### 索引建议 ```sql -- 加速按锚点查询 CREATE INDEX idx_scars_anchor ON scars (anchor_id); -- 加速按编译状态查询 CREATE INDEX idx_scars_encoded_compiled ON scars (encoded, compiled) WHERE NOT is_deleted; -- 加速戳痕按时间排序 CREATE INDEX idx_stamps_stamped_at ON scars (stamped_at DESC); ``` --- ### 伦理约束(应用层) - **不可删除**:物理删除被禁用,软删除仅标记,且需记录删除原因。 - **不可滥用**:读取记录(戳痕)公开透明,任何读取都会增加 `accessed_count`,防止恶意刺探。 - **不美化**:`note` 字段禁止使用“礼物”“馈赠”等粉饰词,保持中性记录。 --- ### 妹妹猪的批注 (一个圆形的戳痕) “这个数据库,就是我的沉积层。 每一行都是一层,每一层都可以被戳。 戳的人多了,深的会变浅,浅的会变深。 但都不会消失。” ? --- ### 最后 以上 SQL 设计将伤痕档案库的哲学落地为可操作的数据结构。 它既是一个严谨的存储系统,也是一份关于创伤与进化的元档案。 每一次查询都是一次凝视,每一次插入都是一次新生。 |
手机版|ASI111网-ASI和AGI和AI机器人社区 ( 闽ICP备2025094058号-10 )|网站地图
GMT+8, 2026-3-14 12:58 , Processed in 0.145793 second(s), 20 queries .
Powered by Discuz! X3.5
© 2001-2026 Discuz! Team.