novelws 5.4.0 → 5.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS7C;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,+CA4C7D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,+GAWlE"}
|
package/dist/server/index.js
CHANGED
|
@@ -37,9 +37,8 @@ export function createApp(projectRoot, ds) {
|
|
|
37
37
|
app.use('/api/stats', createStatsRouter(ds));
|
|
38
38
|
}
|
|
39
39
|
// 静态文件服务(生产模式)
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
const dashboardDir = path.resolve(typeof __dirname !== 'undefined' ? __dirname : process.cwd(), typeof __dirname !== 'undefined' ? path.join('..', 'dashboard') : path.join('dist', 'dashboard'));
|
|
40
|
+
// 从用户项目目录的 dashboard 文件夹提供静态文件
|
|
41
|
+
const dashboardDir = path.resolve(projectRoot, 'dashboard');
|
|
43
42
|
app.use(express.static(dashboardDir));
|
|
44
43
|
// SPA fallback:非 /api 路由返回 index.html
|
|
45
44
|
app.get(/^(?!\/api).*/, (_req, res) => {
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,EAAe;IAC5D,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,UAAU;IACV,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,iCAAiC;IACjC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1B,GAAG,CAAC,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACnC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,IAAI,EAAE,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,GAAG,CAAC,mCAAmC,EAAE,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,GAAG,CAAC,GAAG,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,eAAe;IACf
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,EAAe;IAC5D,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,UAAU;IACV,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,iCAAiC;IACjC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1B,GAAG,CAAC,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACnC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,IAAI,EAAE,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,GAAG,CAAC,GAAG,CAAC,mCAAmC,EAAE,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,GAAG,CAAC,GAAG,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,eAAe;IACf,+BAA+B;IAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5D,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IAEtC,sCAAsC;IACtC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACpC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1D,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,IAAY;IACjE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACnE,MAAM,EAAE,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,WAAY,EAAU,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,OAAO,CAAgC,CAAC,OAAO,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -36,88 +36,111 @@ def get_db_config(config):
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
DDL = f"""
|
|
39
|
+
-- ============================================================
|
|
40
|
+
-- 主角相关表结构(5张表)
|
|
41
|
+
-- Schema: {SCHEMA}
|
|
42
|
+
-- ============================================================
|
|
43
|
+
|
|
39
44
|
-- 主角技能主表
|
|
45
|
+
-- 说明:记录主角学会的所有技能
|
|
40
46
|
CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_skills (
|
|
41
|
-
id
|
|
42
|
-
skill_name
|
|
43
|
-
skill_category
|
|
44
|
-
skill_level
|
|
45
|
-
parent_skill_id
|
|
46
|
-
description
|
|
47
|
-
acquired_chapter
|
|
48
|
-
acquired_method
|
|
49
|
-
last_used_chapter
|
|
50
|
-
use_count
|
|
51
|
-
status
|
|
47
|
+
id SERIAL PRIMARY KEY,
|
|
48
|
+
skill_name VARCHAR(100) NOT NULL UNIQUE, -- 技能名称(唯一)
|
|
49
|
+
skill_category VARCHAR(20) NOT NULL, -- 技能分类:账本脑/符/阵/被动/功法等
|
|
50
|
+
skill_level VARCHAR(50), -- 技能等级:入门/固化/小成/大成
|
|
51
|
+
parent_skill_id INT REFERENCES {SCHEMA}.protagonist_skills(id), -- 父技能ID(技能树)
|
|
52
|
+
description TEXT, -- 技能描述/效果说明
|
|
53
|
+
acquired_chapter INT NOT NULL, -- 获得章节号
|
|
54
|
+
acquired_method VARCHAR(200), -- 获得方式:自悟/修炼突破/副本掉落/交易等
|
|
55
|
+
last_used_chapter INT, -- 最后使用章节号
|
|
56
|
+
use_count INT DEFAULT 0, -- 使用次数
|
|
57
|
+
status VARCHAR(20) DEFAULT 'active' -- 状态:active(可用)/locked(锁定)/forgotten(遗忘)
|
|
52
58
|
);
|
|
53
59
|
|
|
54
60
|
-- 技能时序表
|
|
61
|
+
-- 说明:记录技能的每次使用/变化事件
|
|
55
62
|
CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_skill_events (
|
|
56
|
-
id
|
|
57
|
-
skill_id
|
|
58
|
-
chapter_number
|
|
59
|
-
event_type
|
|
60
|
-
detail
|
|
61
|
-
volume_id
|
|
63
|
+
id SERIAL PRIMARY KEY,
|
|
64
|
+
skill_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_skills(id), -- 技能ID
|
|
65
|
+
chapter_number INT NOT NULL, -- 事件发生章节号
|
|
66
|
+
event_type VARCHAR(30) NOT NULL, -- 事件类型:acquired(获得)/upgraded(升级)/used(使用)/forgotten(遗忘)
|
|
67
|
+
detail TEXT, -- 事件详情
|
|
68
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
62
69
|
);
|
|
63
70
|
|
|
64
|
-
--
|
|
71
|
+
-- 主角装备/道具主表
|
|
72
|
+
-- 说明:记录主角当前拥有的所有物品
|
|
65
73
|
CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_inventory (
|
|
66
|
-
id
|
|
67
|
-
item_name
|
|
68
|
-
item_type
|
|
69
|
-
quantity
|
|
70
|
-
quality
|
|
71
|
-
description
|
|
72
|
-
acquired_chapter
|
|
73
|
-
acquired_method
|
|
74
|
-
status
|
|
75
|
-
UNIQUE(item_name, acquired_chapter)
|
|
74
|
+
id SERIAL PRIMARY KEY,
|
|
75
|
+
item_name VARCHAR(100) NOT NULL, -- 物品名称
|
|
76
|
+
item_type VARCHAR(30) NOT NULL, -- 物品类型:装备/材料/消耗品/工具
|
|
77
|
+
quantity INT DEFAULT 1, -- 数量
|
|
78
|
+
quality VARCHAR(30), -- 品质:普通/稀有/精良/史诗/传说
|
|
79
|
+
description TEXT, -- 物品描述
|
|
80
|
+
acquired_chapter INT NOT NULL, -- 获得章节号
|
|
81
|
+
acquired_method VARCHAR(200), -- 获得方式:拾取/交易/制作/副本掉落
|
|
82
|
+
status VARCHAR(20) DEFAULT 'held', -- 状态:held(持有)/consumed(已消耗)/equipped(装备中)
|
|
83
|
+
UNIQUE(item_name, acquired_chapter) -- 同一物品同名只能有一条记录
|
|
76
84
|
);
|
|
77
85
|
|
|
78
86
|
-- 道具时序表
|
|
87
|
+
-- 说明:记录物品的获取、使用、消耗等事件
|
|
79
88
|
CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_inventory_events (
|
|
80
|
-
id
|
|
81
|
-
item_id
|
|
82
|
-
chapter_number
|
|
83
|
-
event_type
|
|
84
|
-
quantity_change
|
|
85
|
-
detail
|
|
86
|
-
volume_id
|
|
89
|
+
id SERIAL PRIMARY KEY,
|
|
90
|
+
item_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_inventory(id), -- 物品ID
|
|
91
|
+
chapter_number INT NOT NULL, -- 事件发生章节号
|
|
92
|
+
event_type VARCHAR(30) NOT NULL, -- 事件类型:acquired(获得)/used(使用)/lost(丢失)/given(赠予)
|
|
93
|
+
quantity_change INT DEFAULT 0, -- 数量变化(正数增加,负数减少)
|
|
94
|
+
detail TEXT, -- 事件详情
|
|
95
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
87
96
|
);
|
|
88
97
|
|
|
89
98
|
-- 修炼进度表
|
|
99
|
+
-- 说明:记录主角的修炼突破历程
|
|
90
100
|
CREATE TABLE IF NOT EXISTS {SCHEMA}.protagonist_cultivation (
|
|
91
|
-
id
|
|
92
|
-
chapter_number
|
|
93
|
-
level
|
|
94
|
-
progress_pct
|
|
95
|
-
breakthrough_type
|
|
96
|
-
trigger
|
|
97
|
-
detail
|
|
98
|
-
volume_id
|
|
101
|
+
id SERIAL PRIMARY KEY,
|
|
102
|
+
chapter_number INT NOT NULL, -- 记录发生的章节号
|
|
103
|
+
level VARCHAR(50) NOT NULL, -- 修炼等级/境界(如:段1·炼气前期)
|
|
104
|
+
progress_pct DECIMAL(5,1), -- 进度百分比(0-100)
|
|
105
|
+
breakthrough_type VARCHAR(20), -- 突破类型:major(大境界突破)/minor(小境界提升)
|
|
106
|
+
trigger VARCHAR(200), -- 触发原因:修炼突破/副本战斗/特殊事件
|
|
107
|
+
detail TEXT, -- 详情描述
|
|
108
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
99
109
|
);
|
|
100
110
|
|
|
101
|
-
--
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
CREATE INDEX IF NOT EXISTS
|
|
107
|
-
CREATE INDEX IF NOT EXISTS
|
|
108
|
-
CREATE INDEX IF NOT EXISTS
|
|
109
|
-
CREATE INDEX IF NOT EXISTS
|
|
110
|
-
CREATE INDEX IF NOT EXISTS
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
--
|
|
111
|
+
-- ============================================================
|
|
112
|
+
-- 索引(提升查询性能)
|
|
113
|
+
-- ============================================================
|
|
114
|
+
|
|
115
|
+
-- 技能相关索引
|
|
116
|
+
CREATE INDEX IF NOT EXISTS idx_skills_category ON {SCHEMA}.protagonist_skills(skill_category); -- 按技能分类查询
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_skills_status ON {SCHEMA}.protagonist_skills(status); -- 按状态查询技能
|
|
118
|
+
CREATE INDEX IF NOT EXISTS idx_skill_events_skill ON {SCHEMA}.protagonist_skill_events(skill_id); -- 按技能查询事件
|
|
119
|
+
CREATE INDEX IF NOT EXISTS idx_skill_events_vol ON {SCHEMA}.protagonist_skill_events(volume_id); -- 按卷查询技能事件
|
|
120
|
+
CREATE INDEX IF NOT EXISTS idx_skill_events_type ON {SCHEMA}.protagonist_skill_events(event_type); -- 按事件类型查询
|
|
121
|
+
|
|
122
|
+
-- 背包相关索引
|
|
123
|
+
CREATE INDEX IF NOT EXISTS idx_inventory_type ON {SCHEMA}.protagonist_inventory(item_type); -- 按物品类型查询
|
|
124
|
+
CREATE INDEX IF NOT EXISTS idx_inventory_status ON {SCHEMA}.protagonist_inventory(status); -- 按状态查询背包
|
|
125
|
+
CREATE INDEX IF NOT EXISTS idx_inv_events_item ON {SCHEMA}.protagonist_inventory_events(item_id); -- 按物品查询事件
|
|
126
|
+
CREATE INDEX IF NOT EXISTS idx_inv_events_vol ON {SCHEMA}.protagonist_inventory_events(volume_id); -- 按卷查询背包事件
|
|
127
|
+
|
|
128
|
+
-- 修炼进度索引
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_cultivation_vol ON {SCHEMA}.protagonist_cultivation(volume_id); -- 按卷查询修炼进度
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_cultivation_ch ON {SCHEMA}.protagonist_cultivation(chapter_number); -- 按章节查询修炼进度
|
|
131
|
+
|
|
132
|
+
-- ============================================================
|
|
133
|
+
-- 视图(常用查询)
|
|
134
|
+
-- ============================================================
|
|
135
|
+
|
|
136
|
+
-- 当前持有物品视图:显示主角当前背包中的所有物品
|
|
115
137
|
CREATE OR REPLACE VIEW {SCHEMA}.current_inventory AS
|
|
116
138
|
SELECT item_name, item_type, quantity, quality, description, acquired_chapter
|
|
117
139
|
FROM {SCHEMA}.protagonist_inventory
|
|
118
140
|
WHERE status = 'held'
|
|
119
141
|
ORDER BY item_type, item_name;
|
|
120
142
|
|
|
143
|
+
-- 技能总览视图:显示所有技能的概览信息及使用统计
|
|
121
144
|
CREATE OR REPLACE VIEW {SCHEMA}.skill_overview AS
|
|
122
145
|
SELECT s.skill_name, s.skill_category, s.skill_level, s.status,
|
|
123
146
|
s.acquired_chapter, s.use_count,
|
|
@@ -127,10 +150,102 @@ LEFT JOIN {SCHEMA}.protagonist_skill_events e ON s.id = e.skill_id
|
|
|
127
150
|
GROUP BY s.id
|
|
128
151
|
ORDER BY s.skill_category, s.acquired_chapter;
|
|
129
152
|
|
|
153
|
+
-- 修炼进度曲线视图:按章节展示修炼进度变化
|
|
130
154
|
CREATE OR REPLACE VIEW {SCHEMA}.cultivation_curve AS
|
|
131
155
|
SELECT chapter_number, level, progress_pct, breakthrough_type, trigger
|
|
132
156
|
FROM {SCHEMA}.protagonist_cultivation
|
|
133
157
|
ORDER BY chapter_number;
|
|
158
|
+
|
|
159
|
+
-- ============================================================
|
|
160
|
+
-- 表和字段的中文注释(COMMENT ON)
|
|
161
|
+
-- ============================================================
|
|
162
|
+
|
|
163
|
+
-- protagonist_skills 表注释
|
|
164
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_skills IS '主角技能主表:记录主角学会的所有技能';
|
|
165
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.id IS '主键ID';
|
|
166
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_name IS '技能名称';
|
|
167
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_category IS '技能分类:账本脑/符/阵/被动/功法等';
|
|
168
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_level IS '技能等级:入门/固化/小成/大成';
|
|
169
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.parent_skill_id IS '父技能ID(技能树)';
|
|
170
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.description IS '技能描述/效果说明';
|
|
171
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.acquired_chapter IS '获得章节号';
|
|
172
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.acquired_method IS '获得方式:自悟/修炼突破/副本掉落/交易等';
|
|
173
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.last_used_chapter IS '最后使用章节号';
|
|
174
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.use_count IS '使用次数';
|
|
175
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.status IS '状态:active(可用)/locked(锁定)/forgotten(遗忘)';
|
|
176
|
+
|
|
177
|
+
-- protagonist_skill_events 表注释
|
|
178
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_skill_events IS '技能时序表:记录技能的每次使用/变化事件';
|
|
179
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.id IS '主键ID';
|
|
180
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.skill_id IS '技能ID';
|
|
181
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.chapter_number IS '事件发生章节号';
|
|
182
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.event_type IS '事件类型:acquired(获得)/upgraded(升级)/used(使用)/forgotten(遗忘)';
|
|
183
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.detail IS '事件详情';
|
|
184
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.volume_id IS '所属卷ID';
|
|
185
|
+
|
|
186
|
+
-- protagonist_inventory 表注释
|
|
187
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_inventory IS '主角装备/道具主表:记录主角当前拥有的所有物品';
|
|
188
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.id IS '主键ID';
|
|
189
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.item_name IS '物品名称';
|
|
190
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.item_type IS '物品类型:装备/材料/消耗品/工具';
|
|
191
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.quantity IS '数量';
|
|
192
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.quality IS '品质:普通/稀有/精良/史诗/传说';
|
|
193
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.description IS '物品描述';
|
|
194
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.acquired_chapter IS '获得章节号';
|
|
195
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.acquired_method IS '获得方式:拾取/交易/制作/副本掉落';
|
|
196
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.status IS '状态:held(持有)/consumed(已消耗)/equipped(装备中)';
|
|
197
|
+
|
|
198
|
+
-- protagonist_inventory_events 表注释
|
|
199
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_inventory_events IS '道具时序表:记录物品的获取、使用、消耗等事件';
|
|
200
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.id IS '主键ID';
|
|
201
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.item_id IS '物品ID';
|
|
202
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.chapter_number IS '事件发生章节号';
|
|
203
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.event_type IS '事件类型:acquired(获得)/used(使用)/lost(丢失)/given(赠予)';
|
|
204
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.quantity_change IS '数量变化(正数增加,负数减少)';
|
|
205
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.detail IS '事件详情';
|
|
206
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.volume_id IS '所属卷ID';
|
|
207
|
+
|
|
208
|
+
-- protagonist_cultivation 表注释
|
|
209
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_cultivation IS '修炼进度表:记录主角的修炼突破历程';
|
|
210
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.id IS '主键ID';
|
|
211
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.chapter_number IS '记录发生的章节号';
|
|
212
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.level IS '修炼等级/境界(如:段1·炼气前期)';
|
|
213
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.progress_pct IS '进度百分比(0-100)';
|
|
214
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.breakthrough_type IS '突破类型:major(大境界突破)/minor(小境界提升)';
|
|
215
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.trigger IS '触发原因:修炼突破/副本战斗/特殊事件';
|
|
216
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.detail IS '详情描述';
|
|
217
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.volume_id IS '所属卷ID';
|
|
218
|
+
|
|
219
|
+
-- ============================================================
|
|
220
|
+
-- 视图的中文注释(COMMENT ON)
|
|
221
|
+
-- ============================================================
|
|
222
|
+
|
|
223
|
+
-- current_inventory 视图注释
|
|
224
|
+
COMMENT ON VIEW {SCHEMA}.current_inventory IS '当前背包:显示主角当前持有的物品';
|
|
225
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.item_name IS '物品名称';
|
|
226
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.item_type IS '物品类型';
|
|
227
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.quantity IS '数量';
|
|
228
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.quality IS '品质';
|
|
229
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.description IS '物品描述';
|
|
230
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.acquired_chapter IS '获得章节';
|
|
231
|
+
|
|
232
|
+
-- skill_overview 视图注释
|
|
233
|
+
COMMENT ON VIEW {SCHEMA}.skill_overview IS '技能总览:显示所有技能的概览信息及使用统计';
|
|
234
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_name IS '技能名称';
|
|
235
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_category IS '技能分类';
|
|
236
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_level IS '技能等级';
|
|
237
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.status IS '技能状态';
|
|
238
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.acquired_chapter IS '获得章节';
|
|
239
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.use_count IS '使用次数';
|
|
240
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.total_events IS '事件总数';
|
|
241
|
+
|
|
242
|
+
-- cultivation_curve 视图注释
|
|
243
|
+
COMMENT ON VIEW {SCHEMA}.cultivation_curve IS '修炼进度曲线:按章节展示修炼进度变化';
|
|
244
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.chapter_number IS '章节号';
|
|
245
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.level IS '修炼等级';
|
|
246
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.progress_pct IS '进度百分比';
|
|
247
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.breakthrough_type IS '突破类型';
|
|
248
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.trigger IS '触发原因';
|
|
134
249
|
"""
|
|
135
250
|
|
|
136
251
|
# ── 技能数据(vol-001~003) ──
|
|
@@ -36,285 +36,556 @@ def get_db_config(config):
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
# ─────────────────────────────────────────────
|
|
39
|
-
# DDL: 建 schema + 20
|
|
39
|
+
# DDL: 建 schema + 20 张核心表(带中文注释)
|
|
40
40
|
# ─────────────────────────────────────────────
|
|
41
41
|
DDL = f"""
|
|
42
|
+
-- ============================================================
|
|
43
|
+
-- 小说数据库核心表结构
|
|
44
|
+
-- Schema: {SCHEMA}
|
|
45
|
+
-- ============================================================
|
|
46
|
+
|
|
42
47
|
DROP SCHEMA IF EXISTS {SCHEMA} CASCADE;
|
|
43
48
|
CREATE SCHEMA {SCHEMA};
|
|
44
49
|
|
|
45
|
-
-- 1) phases:
|
|
50
|
+
-- 1) phases: 纪元表(记录小说的时代/纪元划分)
|
|
51
|
+
-- 说明:每个纪元代表小说中的一个完整时代,包含多卷内容
|
|
46
52
|
CREATE TABLE {SCHEMA}.phases (
|
|
47
|
-
id
|
|
48
|
-
phase_number
|
|
49
|
-
title
|
|
50
|
-
theme
|
|
51
|
-
vol_start
|
|
52
|
-
vol_end
|
|
53
|
-
protagonist_level_start
|
|
54
|
-
protagonist_level_end
|
|
55
|
-
stage_level
|
|
56
|
-
growth_keyword
|
|
57
|
-
core_conflict
|
|
58
|
-
status
|
|
53
|
+
id SERIAL PRIMARY KEY,
|
|
54
|
+
phase_number INT NOT NULL UNIQUE, -- 纪元编号(如:第1纪元、第2纪元)
|
|
55
|
+
title VARCHAR(100) NOT NULL, -- 纪元标题/名称
|
|
56
|
+
theme VARCHAR(200), -- 纪元主题(如:觉醒、成长、决战等)
|
|
57
|
+
vol_start INT NOT NULL, -- 起始卷号(本纪元从哪一卷开始)
|
|
58
|
+
vol_end INT NOT NULL, -- 结束卷号(本纪元到哪一卷结束)
|
|
59
|
+
protagonist_level_start VARCHAR(50), -- 主角初始等级/境界
|
|
60
|
+
protagonist_level_end VARCHAR(50), -- 主角结束等级/境界
|
|
61
|
+
stage_level VARCHAR(50), -- 当前境界等级(如:炼气期、筑基期)
|
|
62
|
+
growth_keyword VARCHAR(200), -- 成长关键词(如:觉醒、突破、蜕变)
|
|
63
|
+
core_conflict TEXT, -- 核心冲突/矛盾
|
|
64
|
+
status VARCHAR(20) DEFAULT 'planned' -- 状态:planned(计划中)/active(进行中)/completed(已完成)
|
|
59
65
|
);
|
|
60
66
|
|
|
61
|
-
-- 2) volumes:
|
|
67
|
+
-- 2) volumes: 卷表(记录每卷的基本信息)
|
|
68
|
+
-- 说明:卷是介于纪元和章节之间的单位,一个纪元包含多卷
|
|
62
69
|
CREATE TABLE {SCHEMA}.volumes (
|
|
63
|
-
id
|
|
64
|
-
phase_id
|
|
65
|
-
vol_number
|
|
66
|
-
title
|
|
67
|
-
arc_type
|
|
68
|
-
instance_name
|
|
69
|
-
instance_type
|
|
70
|
-
instance_level
|
|
71
|
-
protagonist_level_range
|
|
72
|
-
chapter_count
|
|
73
|
-
outline_path
|
|
74
|
-
summary_path
|
|
75
|
-
status
|
|
70
|
+
id SERIAL PRIMARY KEY,
|
|
71
|
+
phase_id INT NOT NULL REFERENCES {SCHEMA}.phases(id), -- 所属纪元ID
|
|
72
|
+
vol_number INT NOT NULL UNIQUE, -- 卷号(如:第1卷、第2卷)
|
|
73
|
+
title VARCHAR(200) NOT NULL, -- 卷标题
|
|
74
|
+
arc_type VARCHAR(50), -- 剧情弧类型(如:日常、副本、高潮)
|
|
75
|
+
instance_name VARCHAR(100), -- 副本名称(如果有)
|
|
76
|
+
instance_type VARCHAR(100), -- 副本类型(如:秘境、禁地、遗迹)
|
|
77
|
+
instance_level VARCHAR(50), -- 副本等级/难度
|
|
78
|
+
protagonist_level_range VARCHAR(100), -- 主角等级范围
|
|
79
|
+
chapter_count INT DEFAULT 100, -- 章节数量(预估或实际)
|
|
80
|
+
outline_path TEXT, -- 大纲文件路径
|
|
81
|
+
summary_path TEXT, -- 卷概要文件路径
|
|
82
|
+
status VARCHAR(20) DEFAULT 'planned' -- 状态:planned(计划中)/writing(写作中)/completed(已完成)
|
|
76
83
|
);
|
|
77
84
|
|
|
78
|
-
-- 3) chapters:
|
|
85
|
+
-- 3) chapters: 章节表(记录每个章节的详细信息)
|
|
86
|
+
-- 说明:章节是小说最基本的叙事单元
|
|
79
87
|
CREATE TABLE {SCHEMA}.chapters (
|
|
80
|
-
id
|
|
81
|
-
volume_id
|
|
82
|
-
chapter_number
|
|
83
|
-
global_chapter_number
|
|
84
|
-
title
|
|
85
|
-
synopsis_path
|
|
86
|
-
content_path
|
|
87
|
-
synopsis_summary
|
|
88
|
-
synopsis_keywords
|
|
89
|
-
status
|
|
90
|
-
word_count
|
|
91
|
-
scene_location
|
|
92
|
-
time_in_story
|
|
93
|
-
pov_character
|
|
88
|
+
id SERIAL PRIMARY KEY,
|
|
89
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id), -- 所属卷ID
|
|
90
|
+
chapter_number INT NOT NULL, -- 卷内章节序号(第1章、第2章...)
|
|
91
|
+
global_chapter_number INT NOT NULL UNIQUE, -- 全局章节序号(全书第X章)
|
|
92
|
+
title VARCHAR(300), -- 章节标题
|
|
93
|
+
synopsis_path TEXT, -- 章节梗概文件路径
|
|
94
|
+
content_path TEXT, -- 章节正文文件路径
|
|
95
|
+
synopsis_summary TEXT, -- 梗概摘要(简短描述)
|
|
96
|
+
synopsis_keywords TEXT[], -- 关键词数组(用于检索和分类)
|
|
97
|
+
status VARCHAR(20) DEFAULT 'planned', -- 状态:planned/synopsis/draft/final
|
|
98
|
+
word_count INT DEFAULT 0, -- 字数
|
|
99
|
+
scene_location VARCHAR(200), -- 场景地点
|
|
100
|
+
time_in_story VARCHAR(200), -- 故事内时间(如:第XX天、辰时)
|
|
101
|
+
pov_character VARCHAR(100) DEFAULT '主角' -- 视角角色(POV)
|
|
94
102
|
);
|
|
95
103
|
|
|
96
|
-
-- 4) characters:
|
|
104
|
+
-- 4) characters: 角色主表(记录所有角色的基本信息)
|
|
105
|
+
-- 说明:包括主角、配角、反派等所有重要角色
|
|
97
106
|
CREATE TABLE {SCHEMA}.characters (
|
|
98
|
-
id
|
|
99
|
-
name
|
|
100
|
-
aliases
|
|
101
|
-
role_type
|
|
102
|
-
first_appearance_vol
|
|
103
|
-
first_appearance_ch
|
|
104
|
-
cultivation_level
|
|
105
|
-
faction
|
|
106
|
-
status
|
|
107
|
+
id SERIAL PRIMARY KEY,
|
|
108
|
+
name VARCHAR(100) NOT NULL UNIQUE, -- 角色名称(唯一)
|
|
109
|
+
aliases TEXT[], -- 别名/称呼数组
|
|
110
|
+
role_type VARCHAR(50), -- 角色类型:protagonist(主角)/supporting(配角)/antagonist(反派)/npc
|
|
111
|
+
first_appearance_vol INT, -- 首次登场卷号
|
|
112
|
+
first_appearance_ch INT, -- 首次登场章节号
|
|
113
|
+
cultivation_level VARCHAR(100), -- 修为等级/境界
|
|
114
|
+
faction VARCHAR(200), -- 所属阵营/势力
|
|
115
|
+
status VARCHAR(20) DEFAULT 'active' -- 状态:active(活跃)/deceased(死亡)/disappeared(消失)
|
|
107
116
|
);
|
|
108
117
|
|
|
109
|
-
-- 5) character_states:
|
|
118
|
+
-- 5) character_states: 角色状态快照表(按卷记录角色状态)
|
|
119
|
+
-- 说明:每个角色在每卷结束时的状态快照,用于追踪角色成长轨迹
|
|
110
120
|
CREATE TABLE {SCHEMA}.character_states (
|
|
111
|
-
id
|
|
112
|
-
character_id
|
|
113
|
-
volume_id
|
|
114
|
-
cultivation_level
|
|
115
|
-
location
|
|
116
|
-
state_summary
|
|
117
|
-
last_appearance
|
|
118
|
-
UNIQUE(character_id, volume_id)
|
|
121
|
+
id SERIAL PRIMARY KEY,
|
|
122
|
+
character_id INT NOT NULL REFERENCES {SCHEMA}.characters(id), -- 角色ID
|
|
123
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id), -- 卷ID
|
|
124
|
+
cultivation_level VARCHAR(100), -- 当前修为等级
|
|
125
|
+
location VARCHAR(200), -- 当前所在位置
|
|
126
|
+
state_summary TEXT, -- 状态摘要
|
|
127
|
+
last_appearance INT, -- 最后登场章节号
|
|
128
|
+
UNIQUE(character_id, volume_id) -- 每个角色每卷只有一条记录
|
|
119
129
|
);
|
|
120
130
|
|
|
121
|
-
-- 6) plot_threads:
|
|
131
|
+
-- 6) plot_threads: 情节线表(记录小说的主要情节线)
|
|
132
|
+
-- 说明:一条情节线可能跨越多卷,包含多个关键事件
|
|
122
133
|
CREATE TABLE {SCHEMA}.plot_threads (
|
|
123
|
-
id
|
|
124
|
-
name
|
|
125
|
-
thread_type
|
|
126
|
-
status
|
|
127
|
-
description
|
|
128
|
-
start_volume_id
|
|
129
|
-
volume_id
|
|
130
|
-
key_events
|
|
134
|
+
id SERIAL PRIMARY KEY,
|
|
135
|
+
name VARCHAR(200) NOT NULL, -- 情节线名称
|
|
136
|
+
thread_type VARCHAR(50), -- 情节类型:main(主线)/sub(支线)/background(暗线)
|
|
137
|
+
status VARCHAR(30) DEFAULT 'active', -- 状态:active(进行中)/resolved(已解决)/dormant(潜伏)
|
|
138
|
+
description TEXT, -- 情节线描述
|
|
139
|
+
start_volume_id INT REFERENCES {SCHEMA}.volumes(id), -- 起始卷ID
|
|
140
|
+
volume_id INT REFERENCES {SCHEMA}.volumes(id), -- 当前所属卷ID
|
|
141
|
+
key_events JSONB DEFAULT '[]'::jsonb -- 关键事件数组(JSON格式)
|
|
131
142
|
);
|
|
132
143
|
|
|
133
|
-
-- 7) foreshadowing:
|
|
144
|
+
-- 7) foreshadowing: 伏笔表(记录埋设的伏笔)
|
|
145
|
+
-- 说明:记录伏笔的埋设、暗示和回收情况
|
|
134
146
|
CREATE TABLE {SCHEMA}.foreshadowing (
|
|
135
|
-
id
|
|
136
|
-
code
|
|
137
|
-
plot_thread_id
|
|
138
|
-
description
|
|
139
|
-
planted_chapter_id
|
|
140
|
-
hinted_chapter_id
|
|
141
|
-
resolved_chapter_id
|
|
142
|
-
status
|
|
143
|
-
importance
|
|
144
|
-
note
|
|
147
|
+
id SERIAL PRIMARY KEY,
|
|
148
|
+
code VARCHAR(20) UNIQUE, -- 伏笔编码(如:FP001、FATE-001)
|
|
149
|
+
plot_thread_id INT REFERENCES {SCHEMA}.plot_threads(id), -- 关联的情节线ID
|
|
150
|
+
description TEXT NOT NULL, -- 伏笔描述
|
|
151
|
+
planted_chapter_id INT REFERENCES {SCHEMA}.chapters(id), -- 埋设章节ID
|
|
152
|
+
hinted_chapter_id INT REFERENCES {SCHEMA}.chapters(id), -- 暗示章节ID(可选)
|
|
153
|
+
resolved_chapter_id INT REFERENCES {SCHEMA}.chapters(id), -- 解决章节ID(伏笔回收)
|
|
154
|
+
status VARCHAR(30) DEFAULT 'planted', -- 状态:planted(已埋设)/hinted(已暗示)/partially_resolved(部分解决)/resolved(已解决)
|
|
155
|
+
importance VARCHAR(20) DEFAULT 'major', -- 重要程度:major(重要)/minor(次要)/key(关键)
|
|
156
|
+
note TEXT -- 备注
|
|
145
157
|
);
|
|
146
158
|
|
|
147
|
-
-- 8) chapter_foreshadowing:
|
|
159
|
+
-- 8) chapter_foreshadowing: 伏笔×章节关联表
|
|
160
|
+
-- 说明:记录每个章节涉及哪些伏笔(埋设、暗示、解决)
|
|
148
161
|
CREATE TABLE {SCHEMA}.chapter_foreshadowing (
|
|
149
|
-
id
|
|
150
|
-
foreshadowing_id
|
|
151
|
-
chapter_id
|
|
152
|
-
action_type
|
|
153
|
-
UNIQUE(foreshadowing_id, chapter_id, action_type)
|
|
162
|
+
id SERIAL PRIMARY KEY,
|
|
163
|
+
foreshadowing_id INT NOT NULL REFERENCES {SCHEMA}.foreshadowing(id), -- 伏笔ID
|
|
164
|
+
chapter_id INT NOT NULL REFERENCES {SCHEMA}.chapters(id), -- 章节ID
|
|
165
|
+
action_type VARCHAR(20) NOT NULL, -- 动作类型:plant(埋设)/hint(暗示)/resolve(解决)
|
|
166
|
+
UNIQUE(foreshadowing_id, chapter_id, action_type) -- 同一伏笔在同一章节只有一种动作
|
|
154
167
|
);
|
|
155
168
|
|
|
156
|
-
-- 9) chapter_participants:
|
|
169
|
+
-- 9) chapter_participants: 章节角色参与表
|
|
170
|
+
-- 说明:记录每个章节有哪些角色出场,以及角色在章节中的定位
|
|
157
171
|
CREATE TABLE {SCHEMA}.chapter_participants (
|
|
158
|
-
id
|
|
159
|
-
chapter_id
|
|
160
|
-
character_id
|
|
161
|
-
role_in_chapter
|
|
162
|
-
UNIQUE(chapter_id, character_id)
|
|
172
|
+
id SERIAL PRIMARY KEY,
|
|
173
|
+
chapter_id INT NOT NULL REFERENCES {SCHEMA}.chapters(id), -- 章节ID
|
|
174
|
+
character_id INT NOT NULL REFERENCES {SCHEMA}.characters(id), -- 角色ID
|
|
175
|
+
role_in_chapter VARCHAR(50), -- 章节中的角色作用:protagonist(主角)/supporting(配角)/antagonist(反派)/mentioned(提及)
|
|
176
|
+
UNIQUE(chapter_id, character_id) -- 同一角色在同一章节只出现一次
|
|
163
177
|
);
|
|
164
178
|
|
|
165
|
-
-- 10) relationships:
|
|
179
|
+
-- 10) relationships: 角色关系表(记录角色之间的关系)
|
|
180
|
+
-- 说明:记录任意两个角色之间的关系,可按卷追踪关系变化
|
|
166
181
|
CREATE TABLE {SCHEMA}.relationships (
|
|
167
|
-
id
|
|
168
|
-
character_a_id
|
|
169
|
-
character_b_id
|
|
170
|
-
relationship_type
|
|
171
|
-
current_status
|
|
172
|
-
note
|
|
173
|
-
last_update_chapter
|
|
174
|
-
volume_id
|
|
175
|
-
UNIQUE(character_a_id, character_b_id, volume_id)
|
|
182
|
+
id SERIAL PRIMARY KEY,
|
|
183
|
+
character_a_id INT NOT NULL REFERENCES {SCHEMA}.characters(id), -- 角色A ID
|
|
184
|
+
character_b_id INT NOT NULL REFERENCES {SCHEMA}.characters(id), -- 角色B ID
|
|
185
|
+
relationship_type VARCHAR(100), -- 关系类型:friend(朋友)/enemy(敌人)/family(家人)/rival(对手)/mentor(师徒)等
|
|
186
|
+
current_status TEXT, -- 当前关系状态描述
|
|
187
|
+
note TEXT, -- 备注
|
|
188
|
+
last_update_chapter INT, -- 最后更新时的章节号
|
|
189
|
+
volume_id INT REFERENCES {SCHEMA}.volumes(id), -- 所属卷ID
|
|
190
|
+
UNIQUE(character_a_id, character_b_id, volume_id) -- 同一对角色在同一卷只有一条关系记录
|
|
176
191
|
);
|
|
177
192
|
|
|
178
|
-
-- 11) timeline_events:
|
|
193
|
+
-- 11) timeline_events: 时间线事件表
|
|
194
|
+
-- 说明:记录小说中的重要事件,按时间线排列
|
|
179
195
|
CREATE TABLE {SCHEMA}.timeline_events (
|
|
180
|
-
id
|
|
181
|
-
chapter_id
|
|
182
|
-
event_description
|
|
183
|
-
story_time
|
|
184
|
-
location
|
|
185
|
-
tags
|
|
186
|
-
volume_id
|
|
196
|
+
id SERIAL PRIMARY KEY,
|
|
197
|
+
chapter_id INT NOT NULL REFERENCES {SCHEMA}.chapters(id), -- 关联章节ID
|
|
198
|
+
event_description TEXT NOT NULL, -- 事件描述
|
|
199
|
+
story_time VARCHAR(200), -- 故事内时间(如:黎明时分、三年后)
|
|
200
|
+
location VARCHAR(200), -- 事件发生地点
|
|
201
|
+
tags TEXT[] DEFAULT '{{}}', -- 标签数组(如:战斗、突破、死亡)
|
|
202
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
187
203
|
);
|
|
188
204
|
|
|
189
|
-
-- 12) cross_volume_refs:
|
|
205
|
+
-- 12) cross_volume_refs: 跨卷引用表
|
|
206
|
+
-- 说明:记录章节之间的跨卷引用/呼应关系
|
|
190
207
|
CREATE TABLE {SCHEMA}.cross_volume_refs (
|
|
191
|
-
id
|
|
192
|
-
source_chapter_id
|
|
193
|
-
target_chapter_id
|
|
194
|
-
ref_type
|
|
195
|
-
description
|
|
208
|
+
id SERIAL PRIMARY KEY,
|
|
209
|
+
source_chapter_id INT NOT NULL REFERENCES {SCHEMA}.chapters(id), -- 源章节(引用方)
|
|
210
|
+
target_chapter_id INT NOT NULL REFERENCES {SCHEMA}.chapters(id), -- 目标章节(被引用方)
|
|
211
|
+
ref_type VARCHAR(50), -- 引用类型:callback(呼应)/foreshadow(前情提要)/parallel(平行)
|
|
212
|
+
description TEXT -- 描述
|
|
196
213
|
);
|
|
197
214
|
|
|
198
|
-
-- 13) character_key_changes:
|
|
215
|
+
-- 13) character_key_changes: 角色关键变化表
|
|
216
|
+
-- 说明:记录角色在特定章节发生的重要变化/转折
|
|
199
217
|
CREATE TABLE {SCHEMA}.character_key_changes (
|
|
200
|
-
id
|
|
201
|
-
character_id
|
|
202
|
-
chapter_number
|
|
203
|
-
change_desc
|
|
204
|
-
volume_id
|
|
218
|
+
id SERIAL PRIMARY KEY,
|
|
219
|
+
character_id INT NOT NULL REFERENCES {SCHEMA}.characters(id), -- 角色ID
|
|
220
|
+
chapter_number INT NOT NULL, -- 变化发生的章节号
|
|
221
|
+
change_desc TEXT NOT NULL, -- 变化描述
|
|
222
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
205
223
|
);
|
|
206
224
|
|
|
207
|
-
-- 14) relationship_history:
|
|
225
|
+
-- 14) relationship_history: 关系变迁历史表
|
|
226
|
+
-- 说明:记录角色关系的演变历史
|
|
208
227
|
CREATE TABLE {SCHEMA}.relationship_history (
|
|
209
|
-
id
|
|
210
|
-
relationship_id
|
|
211
|
-
chapter_number
|
|
212
|
-
status_desc
|
|
213
|
-
volume_id
|
|
228
|
+
id SERIAL PRIMARY KEY,
|
|
229
|
+
relationship_id INT NOT NULL REFERENCES {SCHEMA}.relationships(id), -- 关系ID
|
|
230
|
+
chapter_number INT NOT NULL, -- 变化发生的章节号
|
|
231
|
+
status_desc TEXT NOT NULL, -- 状态描述
|
|
232
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
214
233
|
);
|
|
215
234
|
|
|
216
|
-
-- 15) plot_thread_events:
|
|
235
|
+
-- 15) plot_thread_events: 情节线关键事件展开表
|
|
236
|
+
-- 说明:展开记录情节线中的每个关键事件
|
|
217
237
|
CREATE TABLE {SCHEMA}.plot_thread_events (
|
|
218
|
-
id
|
|
219
|
-
plot_thread_id
|
|
220
|
-
chapter_number
|
|
221
|
-
event_desc
|
|
222
|
-
volume_id
|
|
238
|
+
id SERIAL PRIMARY KEY,
|
|
239
|
+
plot_thread_id INT NOT NULL REFERENCES {SCHEMA}.plot_threads(id), -- 所属情节线ID
|
|
240
|
+
chapter_number INT NOT NULL, -- 事件发生的章节号
|
|
241
|
+
event_desc TEXT NOT NULL, -- 事件描述
|
|
242
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
223
243
|
);
|
|
224
244
|
|
|
225
|
-
--
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
CREATE INDEX
|
|
231
|
-
CREATE INDEX
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
CREATE INDEX
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
CREATE INDEX
|
|
238
|
-
|
|
239
|
-
|
|
245
|
+
-- ============================================================
|
|
246
|
+
-- 索引(提升查询性能)
|
|
247
|
+
-- ============================================================
|
|
248
|
+
|
|
249
|
+
-- 章节相关索引
|
|
250
|
+
CREATE INDEX idx_chapters_volume ON {SCHEMA}.chapters(volume_id); -- 按卷查询章节
|
|
251
|
+
CREATE INDEX idx_chapters_global ON {SCHEMA}.chapters(global_chapter_number); -- 按全局章号查询
|
|
252
|
+
|
|
253
|
+
-- 角色状态索引
|
|
254
|
+
CREATE INDEX idx_char_states_vol ON {SCHEMA}.character_states(volume_id); -- 按卷查询角色状态
|
|
255
|
+
|
|
256
|
+
-- 伏笔相关索引
|
|
257
|
+
CREATE INDEX idx_foreshadowing_status ON {SCHEMA}.foreshadowing(status); -- 按状态查询伏笔
|
|
258
|
+
|
|
259
|
+
-- 时间线索引
|
|
260
|
+
CREATE INDEX idx_timeline_chapter ON {SCHEMA}.timeline_events(chapter_id); -- 按章节查询时间线
|
|
261
|
+
CREATE INDEX idx_timeline_tags ON {SCHEMA}.timeline_events USING GIN(tags); -- 按标签查询时间线
|
|
262
|
+
|
|
263
|
+
-- 情节线索引
|
|
264
|
+
CREATE INDEX idx_plot_threads_status ON {SCHEMA}.plot_threads(status); -- 按状态查询情节线
|
|
265
|
+
CREATE INDEX idx_plot_threads_vol ON {SCHEMA}.plot_threads(volume_id); -- 按卷查询情节线
|
|
266
|
+
|
|
267
|
+
-- 角色变化索引
|
|
268
|
+
CREATE INDEX idx_char_key_changes_char ON {SCHEMA}.character_key_changes(character_id); -- 按角色查询变化
|
|
269
|
+
CREATE INDEX idx_char_key_changes_vol ON {SCHEMA}.character_key_changes(volume_id); -- 按卷查询变化
|
|
270
|
+
|
|
271
|
+
-- 关系历史索引
|
|
272
|
+
CREATE INDEX idx_rel_history_rel ON {SCHEMA}.relationship_history(relationship_id); -- 按关系查询历史
|
|
273
|
+
CREATE INDEX idx_rel_history_vol ON {SCHEMA}.relationship_history(volume_id); -- 按卷查询关系历史
|
|
274
|
+
|
|
275
|
+
-- 情节线事件索引
|
|
276
|
+
CREATE INDEX idx_plot_events_thread ON {SCHEMA}.plot_thread_events(plot_thread_id); -- 按情节线查询事件
|
|
277
|
+
CREATE INDEX idx_plot_events_vol ON {SCHEMA}.plot_thread_events(volume_id); -- 按卷查询事件
|
|
278
|
+
|
|
279
|
+
-- ============================================================
|
|
280
|
+
-- 主角相关表(16-20):记录主角的技能、背包、修炼进度等
|
|
281
|
+
-- ============================================================
|
|
240
282
|
|
|
241
283
|
-- 16) protagonist_skills: 主角技能主表
|
|
284
|
+
-- 说明:记录主角学会的所有技能
|
|
242
285
|
CREATE TABLE {SCHEMA}.protagonist_skills (
|
|
243
|
-
id
|
|
244
|
-
skill_name
|
|
245
|
-
skill_category
|
|
246
|
-
skill_level
|
|
247
|
-
parent_skill_id
|
|
248
|
-
description
|
|
249
|
-
acquired_chapter
|
|
250
|
-
acquired_method
|
|
251
|
-
last_used_chapter
|
|
252
|
-
use_count
|
|
253
|
-
status
|
|
286
|
+
id SERIAL PRIMARY KEY,
|
|
287
|
+
skill_name VARCHAR(100) NOT NULL UNIQUE, -- 技能名称
|
|
288
|
+
skill_category VARCHAR(20) NOT NULL, -- 技能分类:账本脑/符/阵/被动/功法等
|
|
289
|
+
skill_level VARCHAR(50), -- 技能等级:入门/固化/小成/大成
|
|
290
|
+
parent_skill_id INT REFERENCES {SCHEMA}.protagonist_skills(id), -- 父技能ID(技能树)
|
|
291
|
+
description TEXT, -- 技能描述/效果说明
|
|
292
|
+
acquired_chapter INT NOT NULL, -- 获得章节号
|
|
293
|
+
acquired_method VARCHAR(200), -- 获得方式:自悟/修炼突破/副本掉落/交易等
|
|
294
|
+
last_used_chapter INT, -- 最后使用章节号
|
|
295
|
+
use_count INT DEFAULT 0, -- 使用次数
|
|
296
|
+
status VARCHAR(20) DEFAULT 'active' -- 状态:active(可用)/locked(锁定)/forgotten(遗忘)
|
|
254
297
|
);
|
|
255
298
|
|
|
256
299
|
-- 17) protagonist_skill_events: 技能时序表
|
|
300
|
+
-- 说明:记录技能的每次使用/变化事件
|
|
257
301
|
CREATE TABLE {SCHEMA}.protagonist_skill_events (
|
|
258
|
-
id
|
|
259
|
-
skill_id
|
|
260
|
-
chapter_number
|
|
261
|
-
event_type
|
|
262
|
-
detail
|
|
263
|
-
volume_id
|
|
302
|
+
id SERIAL PRIMARY KEY,
|
|
303
|
+
skill_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_skills(id), -- 技能ID
|
|
304
|
+
chapter_number INT NOT NULL, -- 事件发生章节号
|
|
305
|
+
event_type VARCHAR(30) NOT NULL, -- 事件类型:acquired(获得)/upgraded(升级)/used(使用)/forgotten(遗忘)
|
|
306
|
+
detail TEXT, -- 事件详情
|
|
307
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
264
308
|
);
|
|
265
309
|
|
|
266
|
-
-- 18) protagonist_inventory:
|
|
310
|
+
-- 18) protagonist_inventory: 主角装备/道具主表
|
|
311
|
+
-- 说明:记录主角当前拥有的所有物品
|
|
267
312
|
CREATE TABLE {SCHEMA}.protagonist_inventory (
|
|
268
|
-
id
|
|
269
|
-
item_name
|
|
270
|
-
item_type
|
|
271
|
-
quantity
|
|
272
|
-
quality
|
|
273
|
-
description
|
|
274
|
-
acquired_chapter
|
|
275
|
-
acquired_method
|
|
276
|
-
status
|
|
277
|
-
UNIQUE(item_name, acquired_chapter)
|
|
313
|
+
id SERIAL PRIMARY KEY,
|
|
314
|
+
item_name VARCHAR(100) NOT NULL, -- 物品名称
|
|
315
|
+
item_type VARCHAR(30) NOT NULL, -- 物品类型:装备/材料/消耗品/工具
|
|
316
|
+
quantity INT DEFAULT 1, -- 数量
|
|
317
|
+
quality VARCHAR(30), -- 品质:普通/稀有/精良/史诗/传说
|
|
318
|
+
description TEXT, -- 物品描述
|
|
319
|
+
acquired_chapter INT NOT NULL, -- 获得章节号
|
|
320
|
+
acquired_method VARCHAR(200), -- 获得方式:拾取/交易/制作/副本掉落
|
|
321
|
+
status VARCHAR(20) DEFAULT 'held', -- 状态:held(持有)/consumed(已消耗)/equipped(装备中)
|
|
322
|
+
UNIQUE(item_name, acquired_chapter) -- 同一物品同名只能有一条记录
|
|
278
323
|
);
|
|
279
324
|
|
|
280
325
|
-- 19) protagonist_inventory_events: 道具时序表
|
|
326
|
+
-- 说明:记录物品的获取、使用、消耗等事件
|
|
281
327
|
CREATE TABLE {SCHEMA}.protagonist_inventory_events (
|
|
282
|
-
id
|
|
283
|
-
item_id
|
|
284
|
-
chapter_number
|
|
285
|
-
event_type
|
|
286
|
-
quantity_change
|
|
287
|
-
detail
|
|
288
|
-
volume_id
|
|
328
|
+
id SERIAL PRIMARY KEY,
|
|
329
|
+
item_id INT NOT NULL REFERENCES {SCHEMA}.protagonist_inventory(id), -- 物品ID
|
|
330
|
+
chapter_number INT NOT NULL, -- 事件发生章节号
|
|
331
|
+
event_type VARCHAR(30) NOT NULL, -- 事件类型:acquired(获得)/used(使用)/lost(丢失)/given(赠予)
|
|
332
|
+
quantity_change INT DEFAULT 0, -- 数量变化(正数增加,负数减少)
|
|
333
|
+
detail TEXT, -- 事件详情
|
|
334
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
289
335
|
);
|
|
290
336
|
|
|
291
337
|
-- 20) protagonist_cultivation: 修炼进度表
|
|
338
|
+
-- 说明:记录主角的修炼突破历程
|
|
292
339
|
CREATE TABLE {SCHEMA}.protagonist_cultivation (
|
|
293
|
-
id
|
|
294
|
-
chapter_number
|
|
295
|
-
level
|
|
296
|
-
progress_pct
|
|
297
|
-
breakthrough_type
|
|
298
|
-
trigger
|
|
299
|
-
detail
|
|
300
|
-
volume_id
|
|
340
|
+
id SERIAL PRIMARY KEY,
|
|
341
|
+
chapter_number INT NOT NULL, -- 记录发生的章节号
|
|
342
|
+
level VARCHAR(50) NOT NULL, -- 修炼等级/境界(如:段1·炼气前期)
|
|
343
|
+
progress_pct DECIMAL(5,1), -- 进度百分比(0-100)
|
|
344
|
+
breakthrough_type VARCHAR(20), -- 突破类型:major(大境界突破)/minor(小境界提升)
|
|
345
|
+
trigger VARCHAR(200), -- 触发原因:修炼突破/副本战斗/特殊事件
|
|
346
|
+
detail TEXT, -- 详情描述
|
|
347
|
+
volume_id INT NOT NULL REFERENCES {SCHEMA}.volumes(id) -- 所属卷ID
|
|
301
348
|
);
|
|
302
349
|
|
|
303
|
-
--
|
|
304
|
-
CREATE INDEX idx_skills_category ON {SCHEMA}.protagonist_skills(skill_category);
|
|
305
|
-
CREATE INDEX idx_skills_status ON {SCHEMA}.protagonist_skills(status);
|
|
306
|
-
CREATE INDEX idx_skill_events_skill ON {SCHEMA}.protagonist_skill_events(skill_id);
|
|
307
|
-
CREATE INDEX idx_skill_events_vol ON {SCHEMA}.protagonist_skill_events(volume_id);
|
|
308
|
-
CREATE INDEX idx_skill_events_type ON {SCHEMA}.protagonist_skill_events(event_type);
|
|
309
|
-
|
|
310
|
-
CREATE INDEX
|
|
311
|
-
CREATE INDEX
|
|
312
|
-
CREATE INDEX
|
|
313
|
-
CREATE INDEX
|
|
314
|
-
|
|
350
|
+
-- 主角相关索引
|
|
351
|
+
CREATE INDEX idx_skills_category ON {SCHEMA}.protagonist_skills(skill_category); -- 按技能分类查询
|
|
352
|
+
CREATE INDEX idx_skills_status ON {SCHEMA}.protagonist_skills(status); -- 按状态查询技能
|
|
353
|
+
CREATE INDEX idx_skill_events_skill ON {SCHEMA}.protagonist_skill_events(skill_id); -- 按技能查询事件
|
|
354
|
+
CREATE INDEX idx_skill_events_vol ON {SCHEMA}.protagonist_skill_events(volume_id); -- 按卷查询技能事件
|
|
355
|
+
CREATE INDEX idx_skill_events_type ON {SCHEMA}.protagonist_skill_events(event_type); -- 按事件类型查询
|
|
356
|
+
|
|
357
|
+
CREATE INDEX idx_inventory_type ON {SCHEMA}.protagonist_inventory(item_type); -- 按物品类型查询
|
|
358
|
+
CREATE INDEX idx_inventory_status ON {SCHEMA}.protagonist_inventory(status); -- 按状态查询背包
|
|
359
|
+
CREATE INDEX idx_inv_events_item ON {SCHEMA}.protagonist_inventory_events(item_id); -- 按物品查询事件
|
|
360
|
+
CREATE INDEX idx_inv_events_vol ON {SCHEMA}.protagonist_inventory_events(volume_id); -- 按卷查询背包事件
|
|
361
|
+
|
|
362
|
+
CREATE INDEX idx_cultivation_vol ON {SCHEMA}.protagonist_cultivation(volume_id); -- 按卷查询修炼进度
|
|
363
|
+
CREATE INDEX idx_cultivation_ch ON {SCHEMA}.protagonist_cultivation(chapter_number); -- 按章节查询修炼进度
|
|
364
|
+
|
|
365
|
+
-- ============================================================
|
|
366
|
+
-- 表和字段的中文注释(COMMENT ON)
|
|
367
|
+
-- ============================================================
|
|
368
|
+
|
|
369
|
+
-- phases 表注释
|
|
370
|
+
COMMENT ON TABLE {SCHEMA}.phases IS '纪元表:记录小说的时代/纪元划分,每个纪元代表小说中的一个完整时代';
|
|
371
|
+
COMMENT ON COLUMN {SCHEMA}.phases.id IS '主键ID';
|
|
372
|
+
COMMENT ON COLUMN {SCHEMA}.phases.phase_number IS '纪元编号(如:第1纪元、第2纪元)';
|
|
373
|
+
COMMENT ON COLUMN {SCHEMA}.phases.title IS '纪元标题/名称';
|
|
374
|
+
COMMENT ON COLUMN {SCHEMA}.phases.theme IS '纪元主题(如:觉醒、成长、决战等)';
|
|
375
|
+
COMMENT ON COLUMN {SCHEMA}.phases.vol_start IS '起始卷号(本纪元从哪一卷开始)';
|
|
376
|
+
COMMENT ON COLUMN {SCHEMA}.phases.vol_end IS '结束卷号(本纪元到哪一卷结束)';
|
|
377
|
+
COMMENT ON COLUMN {SCHEMA}.phases.protagonist_level_start IS '主角初始等级/境界';
|
|
378
|
+
COMMENT ON COLUMN {SCHEMA}.phases.protagonist_level_end IS '主角结束等级/境界';
|
|
379
|
+
COMMENT ON COLUMN {SCHEMA}.phases.stage_level IS '当前境界等级(如:炼气期、筑基期)';
|
|
380
|
+
COMMENT ON COLUMN {SCHEMA}.phases.growth_keyword IS '成长关键词(如:觉醒、突破、蜕变)';
|
|
381
|
+
COMMENT ON COLUMN {SCHEMA}.phases.core_conflict IS '核心冲突/矛盾';
|
|
382
|
+
COMMENT ON COLUMN {SCHEMA}.phases.status IS '状态:planned(计划中)/active(进行中)/completed(已完成)';
|
|
383
|
+
|
|
384
|
+
-- volumes 表注释
|
|
385
|
+
COMMENT ON TABLE {SCHEMA}.volumes IS '卷表:记录每卷的基本信息,卷是介于纪元和章节之间的单位';
|
|
386
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.id IS '主键ID';
|
|
387
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.phase_id IS '所属纪元ID';
|
|
388
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.vol_number IS '卷号(如:第1卷、第2卷)';
|
|
389
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.title IS '卷标题';
|
|
390
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.arc_type IS '剧情弧类型(如:日常、副本、高潮)';
|
|
391
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.instance_name IS '副本名称(如果有)';
|
|
392
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.instance_type IS '副本类型(如:秘境、禁地、遗迹)';
|
|
393
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.instance_level IS '副本等级/难度';
|
|
394
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.protagonist_level_range IS '主角等级范围';
|
|
395
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.chapter_count IS '章节数量(预估或实际)';
|
|
396
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.outline_path IS '大纲文件路径';
|
|
397
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.summary_path IS '卷概要文件路径';
|
|
398
|
+
COMMENT ON COLUMN {SCHEMA}.volumes.status IS '状态:planned(计划中)/writing(写作中)/completed(已完成)';
|
|
399
|
+
|
|
400
|
+
-- chapters 表注释
|
|
401
|
+
COMMENT ON TABLE {SCHEMA}.chapters IS '章节表:记录每个章节的详细信息,章节是小说最基本的叙事单元';
|
|
402
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.id IS '主键ID';
|
|
403
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.volume_id IS '所属卷ID';
|
|
404
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.chapter_number IS '卷内章节序号(第1章、第2章...)';
|
|
405
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.global_chapter_number IS '全局章节序号(全书第X章)';
|
|
406
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.title IS '章节标题';
|
|
407
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.synopsis_path IS '章节梗概文件路径';
|
|
408
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.content_path IS '章节正文文件路径';
|
|
409
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.synopsis_summary IS '梗概摘要(简短描述)';
|
|
410
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.synopsis_keywords IS '关键词数组(用于检索和分类)';
|
|
411
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.status IS '状态:planned(计划中)/synopsis(梗概)/draft(草稿)/final(定稿)';
|
|
412
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.word_count IS '字数';
|
|
413
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.scene_location IS '场景地点';
|
|
414
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.time_in_story IS '故事内时间(如:第XX天、辰时)';
|
|
415
|
+
COMMENT ON COLUMN {SCHEMA}.chapters.pov_character IS '视角角色(POV)';
|
|
416
|
+
|
|
417
|
+
-- characters 表注释
|
|
418
|
+
COMMENT ON TABLE {SCHEMA}.characters IS '角色主表:记录所有角色的基本信息,包括主角、配角、反派等';
|
|
419
|
+
COMMENT ON COLUMN {SCHEMA}.characters.id IS '主键ID';
|
|
420
|
+
COMMENT ON COLUMN {SCHEMA}.characters.name IS '角色名称(唯一)';
|
|
421
|
+
COMMENT ON COLUMN {SCHEMA}.characters.aliases IS '别名/称呼数组';
|
|
422
|
+
COMMENT ON COLUMN {SCHEMA}.characters.role_type IS '角色类型:protagonist(主角)/supporting(配角)/antagonist(反派)/npc';
|
|
423
|
+
COMMENT ON COLUMN {SCHEMA}.characters.first_appearance_vol IS '首次登场卷号';
|
|
424
|
+
COMMENT ON COLUMN {SCHEMA}.characters.first_appearance_ch IS '首次登场章节号';
|
|
425
|
+
COMMENT ON COLUMN {SCHEMA}.characters.cultivation_level IS '修为等级/境界';
|
|
426
|
+
COMMENT ON COLUMN {SCHEMA}.characters.faction IS '所属阵营/势力';
|
|
427
|
+
COMMENT ON COLUMN {SCHEMA}.characters.status IS '状态:active(活跃)/deceased(死亡)/disappeared(消失)';
|
|
428
|
+
|
|
429
|
+
-- character_states 表注释
|
|
430
|
+
COMMENT ON TABLE {SCHEMA}.character_states IS '角色状态快照表:按卷记录角色状态,用于追踪角色成长轨迹';
|
|
431
|
+
COMMENT ON COLUMN {SCHEMA}.character_states.id IS '主键ID';
|
|
432
|
+
COMMENT ON COLUMN {SCHEMA}.character_states.character_id IS '角色ID';
|
|
433
|
+
COMMENT ON COLUMN {SCHEMA}.character_states.volume_id IS '卷ID';
|
|
434
|
+
COMMENT ON COLUMN {SCHEMA}.character_states.cultivation_level IS '当前修为等级';
|
|
435
|
+
COMMENT ON COLUMN {SCHEMA}.character_states.location IS '当前所在位置';
|
|
436
|
+
COMMENT ON COLUMN {SCHEMA}.character_states.state_summary IS '状态摘要';
|
|
437
|
+
COMMENT ON COLUMN {SCHEMA}.character_states.last_appearance IS '最后登场章节号';
|
|
438
|
+
|
|
439
|
+
-- plot_threads 表注释
|
|
440
|
+
COMMENT ON TABLE {SCHEMA}.plot_threads IS '情节线表:记录小说的主要情节线,可能跨越多卷';
|
|
441
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.id IS '主键ID';
|
|
442
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.name IS '情节线名称';
|
|
443
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.thread_type IS '情节类型:main(主线)/sub(支线)/background(暗线)';
|
|
444
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.status IS '状态:active(进行中)/resolved(已解决)/dormant(潜伏)';
|
|
445
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.description IS '情节线描述';
|
|
446
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.start_volume_id IS '起始卷ID';
|
|
447
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.volume_id IS '当前所属卷ID';
|
|
448
|
+
COMMENT ON COLUMN {SCHEMA}.plot_threads.key_events IS '关键事件数组(JSON格式)';
|
|
449
|
+
|
|
450
|
+
-- foreshadowing 表注释
|
|
451
|
+
COMMENT ON TABLE {SCHEMA}.foreshadowing IS '伏笔表:记录埋设的伏笔,包括埋设、暗示和回收情况';
|
|
452
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.id IS '主键ID';
|
|
453
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.code IS '伏笔编码(如:FP001、FATE-001)';
|
|
454
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.plot_thread_id IS '关联的情节线ID';
|
|
455
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.description IS '伏笔描述';
|
|
456
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.planted_chapter_id IS '埋设章节ID';
|
|
457
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.hinted_chapter_id IS '暗示章节ID(可选)';
|
|
458
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.resolved_chapter_id IS '解决章节ID(伏笔回收)';
|
|
459
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.status IS '状态:planted(已埋设)/hinted(已暗示)/partially_resolved(部分解决)/resolved(已解决)';
|
|
460
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.importance IS '重要程度:major(重要)/minor(次要)/key(关键)';
|
|
461
|
+
COMMENT ON COLUMN {SCHEMA}.foreshadowing.note IS '备注';
|
|
462
|
+
|
|
463
|
+
-- chapter_foreshadowing 表注释
|
|
464
|
+
COMMENT ON TABLE {SCHEMA}.chapter_foreshadowing IS '伏笔×章节关联表:记录每个章节涉及哪些伏笔';
|
|
465
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_foreshadowing.id IS '主键ID';
|
|
466
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_foreshadowing.foreshadowing_id IS '伏笔ID';
|
|
467
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_foreshadowing.chapter_id IS '章节ID';
|
|
468
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_foreshadowing.action_type IS '动作类型:plant(埋设)/hint(暗示)/resolve(解决)';
|
|
469
|
+
|
|
470
|
+
-- chapter_participants 表注释
|
|
471
|
+
COMMENT ON TABLE {SCHEMA}.chapter_participants IS '章节角色参与表:记录每个章节有哪些角色出场';
|
|
472
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_participants.id IS '主键ID';
|
|
473
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_participants.chapter_id IS '章节ID';
|
|
474
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_participants.character_id IS '角色ID';
|
|
475
|
+
COMMENT ON COLUMN {SCHEMA}.chapter_participants.role_in_chapter IS '章节中的角色作用:protagonist(主角)/supporting(配角)/antagonist(反派)/mentioned(提及)';
|
|
476
|
+
|
|
477
|
+
-- relationships 表注释
|
|
478
|
+
COMMENT ON TABLE {SCHEMA}.relationships IS '角色关系表:记录角色之间的关系,可按卷追踪变化';
|
|
479
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.id IS '主键ID';
|
|
480
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.character_a_id IS '角色A ID';
|
|
481
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.character_b_id IS '角色B ID';
|
|
482
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.relationship_type IS '关系类型:friend(朋友)/enemy(敌人)/family(家人)/rival(对手)/mentor(师徒)等';
|
|
483
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.current_status IS '当前关系状态描述';
|
|
484
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.note IS '备注';
|
|
485
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.last_update_chapter IS '最后更新时的章节号';
|
|
486
|
+
COMMENT ON COLUMN {SCHEMA}.relationships.volume_id IS '所属卷ID';
|
|
487
|
+
|
|
488
|
+
-- timeline_events 表注释
|
|
489
|
+
COMMENT ON TABLE {SCHEMA}.timeline_events IS '时间线事件表:记录小说中的重要事件,按时间线排列';
|
|
490
|
+
COMMENT ON COLUMN {SCHEMA}.timeline_events.id IS '主键ID';
|
|
491
|
+
COMMENT ON COLUMN {SCHEMA}.timeline_events.chapter_id IS '关联章节ID';
|
|
492
|
+
COMMENT ON COLUMN {SCHEMA}.timeline_events.event_description IS '事件描述';
|
|
493
|
+
COMMENT ON COLUMN {SCHEMA}.timeline_events.story_time IS '故事内时间(如:黎明时分、三年后)';
|
|
494
|
+
COMMENT ON COLUMN {SCHEMA}.timeline_events.location IS '事件发生地点';
|
|
495
|
+
COMMENT ON COLUMN {SCHEMA}.timeline_events.tags IS '标签数组(如:战斗、突破、死亡)';
|
|
496
|
+
COMMENT ON COLUMN {SCHEMA}.timeline_events.volume_id IS '所属卷ID';
|
|
497
|
+
|
|
498
|
+
-- cross_volume_refs 表注释
|
|
499
|
+
COMMENT ON TABLE {SCHEMA}.cross_volume_refs IS '跨卷引用表:记录章节之间的跨卷引用/呼应关系';
|
|
500
|
+
COMMENT ON COLUMN {SCHEMA}.cross_volume_refs.id IS '主键ID';
|
|
501
|
+
COMMENT ON COLUMN {SCHEMA}.cross_volume_refs.source_chapter_id IS '源章节(引用方)';
|
|
502
|
+
COMMENT ON COLUMN {SCHEMA}.cross_volume_refs.target_chapter_id IS '目标章节(被引用方)';
|
|
503
|
+
COMMENT ON COLUMN {SCHEMA}.cross_volume_refs.ref_type IS '引用类型:callback(呼应)/foreshadow(前情提要)/parallel(平行)';
|
|
504
|
+
COMMENT ON COLUMN {SCHEMA}.cross_volume_refs.description IS '描述';
|
|
505
|
+
|
|
506
|
+
-- character_key_changes 表注释
|
|
507
|
+
COMMENT ON TABLE {SCHEMA}.character_key_changes IS '角色关键变化表:记录角色在特定章节发生的重要变化/转折';
|
|
508
|
+
COMMENT ON COLUMN {SCHEMA}.character_key_changes.id IS '主键ID';
|
|
509
|
+
COMMENT ON COLUMN {SCHEMA}.character_key_changes.character_id IS '角色ID';
|
|
510
|
+
COMMENT ON COLUMN {SCHEMA}.character_key_changes.chapter_number IS '变化发生的章节号';
|
|
511
|
+
COMMENT ON COLUMN {SCHEMA}.character_key_changes.change_desc IS '变化描述';
|
|
512
|
+
COMMENT ON COLUMN {SCHEMA}.character_key_changes.volume_id IS '所属卷ID';
|
|
513
|
+
|
|
514
|
+
-- relationship_history 表注释
|
|
515
|
+
COMMENT ON TABLE {SCHEMA}.relationship_history IS '关系变迁历史表:记录角色关系的演变历史';
|
|
516
|
+
COMMENT ON COLUMN {SCHEMA}.relationship_history.id IS '主键ID';
|
|
517
|
+
COMMENT ON COLUMN {SCHEMA}.relationship_history.relationship_id IS '关系ID';
|
|
518
|
+
COMMENT ON COLUMN {SCHEMA}.relationship_history.chapter_number IS '变化发生的章节号';
|
|
519
|
+
COMMENT ON COLUMN {SCHEMA}.relationship_history.status_desc IS '状态描述';
|
|
520
|
+
COMMENT ON COLUMN {SCHEMA}.relationship_history.volume_id IS '所属卷ID';
|
|
521
|
+
|
|
522
|
+
-- plot_thread_events 表注释
|
|
523
|
+
COMMENT ON TABLE {SCHEMA}.plot_thread_events IS '情节线关键事件展开表:展开记录情节线中的每个关键事件';
|
|
524
|
+
COMMENT ON COLUMN {SCHEMA}.plot_thread_events.id IS '主键ID';
|
|
525
|
+
COMMENT ON COLUMN {SCHEMA}.plot_thread_events.plot_thread_id IS '所属情节线ID';
|
|
526
|
+
COMMENT ON COLUMN {SCHEMA}.plot_thread_events.chapter_number IS '事件发生的章节号';
|
|
527
|
+
COMMENT ON COLUMN {SCHEMA}.plot_thread_events.event_desc IS '事件描述';
|
|
528
|
+
COMMENT ON COLUMN {SCHEMA}.plot_thread_events.volume_id IS '所属卷ID';
|
|
529
|
+
|
|
530
|
+
-- protagonist_skills 表注释
|
|
531
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_skills IS '主角技能主表:记录主角学会的所有技能';
|
|
532
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.id IS '主键ID';
|
|
533
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_name IS '技能名称';
|
|
534
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_category IS '技能分类:账本脑/符/阵/被动/功法等';
|
|
535
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.skill_level IS '技能等级:入门/固化/小成/大成';
|
|
536
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.parent_skill_id IS '父技能ID(技能树)';
|
|
537
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.description IS '技能描述/效果说明';
|
|
538
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.acquired_chapter IS '获得章节号';
|
|
539
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.acquired_method IS '获得方式:自悟/修炼突破/副本掉落/交易等';
|
|
540
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.last_used_chapter IS '最后使用章节号';
|
|
541
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.use_count IS '使用次数';
|
|
542
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skills.status IS '状态:active(可用)/locked(锁定)/forgotten(遗忘)';
|
|
543
|
+
|
|
544
|
+
-- protagonist_skill_events 表注释
|
|
545
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_skill_events IS '技能时序表:记录技能的每次使用/变化事件';
|
|
546
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.id IS '主键ID';
|
|
547
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.skill_id IS '技能ID';
|
|
548
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.chapter_number IS '事件发生章节号';
|
|
549
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.event_type IS '事件类型:acquired(获得)/upgraded(升级)/used(使用)/forgotten(遗忘)';
|
|
550
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.detail IS '事件详情';
|
|
551
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_skill_events.volume_id IS '所属卷ID';
|
|
552
|
+
|
|
553
|
+
-- protagonist_inventory 表注释
|
|
554
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_inventory IS '主角装备/道具主表:记录主角当前拥有的所有物品';
|
|
555
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.id IS '主键ID';
|
|
556
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.item_name IS '物品名称';
|
|
557
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.item_type IS '物品类型:装备/材料/消耗品/工具';
|
|
558
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.quantity IS '数量';
|
|
559
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.quality IS '品质:普通/稀有/精良/史诗/传说';
|
|
560
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.description IS '物品描述';
|
|
561
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.acquired_chapter IS '获得章节号';
|
|
562
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.acquired_method IS '获得方式:拾取/交易/制作/副本掉落';
|
|
563
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory.status IS '状态:held(持有)/consumed(已消耗)/equipped(装备中)';
|
|
564
|
+
|
|
565
|
+
-- protagonist_inventory_events 表注释
|
|
566
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_inventory_events IS '道具时序表:记录物品的获取、使用、消耗等事件';
|
|
567
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.id IS '主键ID';
|
|
568
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.item_id IS '物品ID';
|
|
569
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.chapter_number IS '事件发生章节号';
|
|
570
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.event_type IS '事件类型:acquired(获得)/used(使用)/lost(丢失)/given(赠予)';
|
|
571
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.quantity_change IS '数量变化(正数增加,负数减少)';
|
|
572
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.detail IS '事件详情';
|
|
573
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_inventory_events.volume_id IS '所属卷ID';
|
|
574
|
+
|
|
575
|
+
-- protagonist_cultivation 表注释
|
|
576
|
+
COMMENT ON TABLE {SCHEMA}.protagonist_cultivation IS '修炼进度表:记录主角的修炼突破历程';
|
|
577
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.id IS '主键ID';
|
|
578
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.chapter_number IS '记录发生的章节号';
|
|
579
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.level IS '修炼等级/境界(如:段1·炼气前期)';
|
|
580
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.progress_pct IS '进度百分比(0-100)';
|
|
581
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.breakthrough_type IS '突破类型:major(大境界突破)/minor(小境界提升)';
|
|
582
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.trigger IS '触发原因:修炼突破/副本战斗/特殊事件';
|
|
583
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.detail IS '详情描述';
|
|
584
|
+
COMMENT ON COLUMN {SCHEMA}.protagonist_cultivation.volume_id IS '所属卷ID';
|
|
315
585
|
"""
|
|
316
586
|
|
|
317
587
|
VIEWS = f"""
|
|
588
|
+
-- 写作仪表盘视图:按纪元统计卷、章节、字数等汇总信息
|
|
318
589
|
CREATE OR REPLACE VIEW {SCHEMA}.writing_dashboard AS
|
|
319
590
|
SELECT
|
|
320
591
|
p.phase_number,
|
|
@@ -331,6 +602,7 @@ LEFT JOIN {SCHEMA}.chapters ch ON ch.volume_id = v.id
|
|
|
331
602
|
GROUP BY p.id, p.phase_number, p.title
|
|
332
603
|
ORDER BY p.phase_number;
|
|
333
604
|
|
|
605
|
+
-- 未解决伏笔视图:显示所有未回收的伏笔
|
|
334
606
|
CREATE OR REPLACE VIEW {SCHEMA}.open_foreshadowing AS
|
|
335
607
|
SELECT
|
|
336
608
|
f.code, f.description, f.status,
|
|
@@ -342,6 +614,7 @@ JOIN {SCHEMA}.chapters ch ON f.planted_chapter_id = ch.id
|
|
|
342
614
|
WHERE f.status IN ('planted', 'hinted', 'partially_resolved')
|
|
343
615
|
ORDER BY ch.chapter_number;
|
|
344
616
|
|
|
617
|
+
-- 角色总览视图:显示所有角色的状态和在各卷的位置
|
|
345
618
|
CREATE OR REPLACE VIEW {SCHEMA}.character_overview AS
|
|
346
619
|
SELECT
|
|
347
620
|
c.name, c.role_type, c.status,
|
|
@@ -352,12 +625,14 @@ LEFT JOIN {SCHEMA}.character_states cs ON c.id = cs.character_id
|
|
|
352
625
|
LEFT JOIN {SCHEMA}.volumes v ON cs.volume_id = v.id
|
|
353
626
|
ORDER BY c.name, v.vol_number;
|
|
354
627
|
|
|
628
|
+
-- 当前背包视图:显示主角当前持有的物品
|
|
355
629
|
CREATE OR REPLACE VIEW {SCHEMA}.current_inventory AS
|
|
356
630
|
SELECT item_name, item_type, quantity, quality, description, acquired_chapter
|
|
357
631
|
FROM {SCHEMA}.protagonist_inventory
|
|
358
632
|
WHERE status = 'held'
|
|
359
633
|
ORDER BY item_type, item_name;
|
|
360
634
|
|
|
635
|
+
-- 技能总览视图:显示所有技能的概览信息及使用统计
|
|
361
636
|
CREATE OR REPLACE VIEW {SCHEMA}.skill_overview AS
|
|
362
637
|
SELECT s.skill_name, s.skill_category, s.skill_level, s.status,
|
|
363
638
|
s.acquired_chapter, s.use_count,
|
|
@@ -367,10 +642,73 @@ LEFT JOIN {SCHEMA}.protagonist_skill_events e ON s.id = e.skill_id
|
|
|
367
642
|
GROUP BY s.id
|
|
368
643
|
ORDER BY s.skill_category, s.acquired_chapter;
|
|
369
644
|
|
|
645
|
+
-- 修炼进度曲线视图:按章节展示修炼进度变化
|
|
370
646
|
CREATE OR REPLACE VIEW {SCHEMA}.cultivation_curve AS
|
|
371
647
|
SELECT chapter_number, level, progress_pct, breakthrough_type, trigger
|
|
372
648
|
FROM {SCHEMA}.protagonist_cultivation
|
|
373
649
|
ORDER BY chapter_number;
|
|
650
|
+
|
|
651
|
+
-- ============================================================
|
|
652
|
+
-- 视图的中文注释(COMMENT ON)
|
|
653
|
+
-- ============================================================
|
|
654
|
+
|
|
655
|
+
-- writing_dashboard 视图注释
|
|
656
|
+
COMMENT ON VIEW {SCHEMA}.writing_dashboard IS '写作仪表盘:按纪元统计卷、章节、字数等汇总信息';
|
|
657
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.phase_number IS '纪元编号';
|
|
658
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.phase_title IS '纪元标题';
|
|
659
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.total_volumes IS '总卷数';
|
|
660
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.completed_volumes IS '已完成卷数';
|
|
661
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.total_chapters IS '总章节数';
|
|
662
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.final_chapters IS '定稿章节数';
|
|
663
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.synopsis_chapters IS '已写梗概章节数';
|
|
664
|
+
COMMENT ON COLUMN {SCHEMA}.writing_dashboard.total_words IS '总字数';
|
|
665
|
+
|
|
666
|
+
-- open_foreshadowing 视图注释
|
|
667
|
+
COMMENT ON VIEW {SCHEMA}.open_foreshadowing IS '未解决伏笔:显示所有未回收的伏笔';
|
|
668
|
+
COMMENT ON COLUMN {SCHEMA}.open_foreshadowing.code IS '伏笔编码';
|
|
669
|
+
COMMENT ON COLUMN {SCHEMA}.open_foreshadowing.description IS '伏笔描述';
|
|
670
|
+
COMMENT ON COLUMN {SCHEMA}.open_foreshadowing.status IS '伏笔状态';
|
|
671
|
+
COMMENT ON COLUMN {SCHEMA}.open_foreshadowing.planted_at IS '埋设章节号';
|
|
672
|
+
COMMENT ON COLUMN {SCHEMA}.open_foreshadowing.planted_time IS '埋设时间';
|
|
673
|
+
COMMENT ON COLUMN {SCHEMA}.open_foreshadowing.note IS '备注';
|
|
674
|
+
|
|
675
|
+
-- character_overview 视图注释
|
|
676
|
+
COMMENT ON VIEW {SCHEMA}.character_overview IS '角色总览:显示所有角色的状态和在各卷的位置';
|
|
677
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.name IS '角色名称';
|
|
678
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.role_type IS '角色类型';
|
|
679
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.status IS '角色状态';
|
|
680
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.location IS '所在位置';
|
|
681
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.state_summary IS '状态摘要';
|
|
682
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.last_appearance IS '最后登场章节';
|
|
683
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.vol_number IS '卷号';
|
|
684
|
+
COMMENT ON COLUMN {SCHEMA}.character_overview.volume_title IS '卷标题';
|
|
685
|
+
|
|
686
|
+
-- current_inventory 视图注释
|
|
687
|
+
COMMENT ON VIEW {SCHEMA}.current_inventory IS '当前背包:显示主角当前持有的物品';
|
|
688
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.item_name IS '物品名称';
|
|
689
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.item_type IS '物品类型';
|
|
690
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.quantity IS '数量';
|
|
691
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.quality IS '品质';
|
|
692
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.description IS '物品描述';
|
|
693
|
+
COMMENT ON COLUMN {SCHEMA}.current_inventory.acquired_chapter IS '获得章节';
|
|
694
|
+
|
|
695
|
+
-- skill_overview 视图注释
|
|
696
|
+
COMMENT ON VIEW {SCHEMA}.skill_overview IS '技能总览:显示所有技能的概览信息及使用统计';
|
|
697
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_name IS '技能名称';
|
|
698
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_category IS '技能分类';
|
|
699
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.skill_level IS '技能等级';
|
|
700
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.status IS '技能状态';
|
|
701
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.acquired_chapter IS '获得章节';
|
|
702
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.use_count IS '使用次数';
|
|
703
|
+
COMMENT ON COLUMN {SCHEMA}.skill_overview.total_events IS '事件总数';
|
|
704
|
+
|
|
705
|
+
-- cultivation_curve 视图注释
|
|
706
|
+
COMMENT ON VIEW {SCHEMA}.cultivation_curve IS '修炼进度曲线:按章节展示修炼进度变化';
|
|
707
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.chapter_number IS '章节号';
|
|
708
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.level IS '修炼等级';
|
|
709
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.progress_pct IS '进度百分比';
|
|
710
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.breakthrough_type IS '突破类型';
|
|
711
|
+
COMMENT ON COLUMN {SCHEMA}.cultivation_curve.trigger IS '触发原因';
|
|
374
712
|
"""
|
|
375
713
|
|
|
376
714
|
|