-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgowebDB.sql
More file actions
332 lines (296 loc) · 9.35 KB
/
gowebDB.sql
File metadata and controls
332 lines (296 loc) · 9.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
-- ----------based on postgres sql-------------------
-- ----------------数据表定义--------------------------
-- -------------------v3.0---------------------------
-- LEFT(in_content, 50) 截断字符串
-- 用户表
DROP TABLE IF EXISTS "user";
CREATE TABLE "user"
(
id SERIAL PRIMARY KEY,
username VARCHAR(32) NOT NULL UNIQUE,
password VARCHAR(64) NOT NULL,
email VARCHAR(32) NOT NULL UNIQUE,
status SMALLINT NOT NULL DEFAULT 0, -- 0-ok 1-block
sex SMALLINT NOT NULL DEFAULT 0, -- 0-unknown 1-man 2-woman
exp INT NOT NULL DEFAULT 0, -- 经验值
birthday DATE,
phone VARCHAR(64), -- 手机号
description VARCHAR(512), -- 个人简介
site VARCHAR(128), -- 个人网站
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 用户认证表
DROP TABLE IF EXISTS auth;
CREATE TABLE auth
(
id SERIAL PRIMARY KEY,
uid INT NOT NULL REFERENCES "user" (id)
ON DELETE CASCADE,
type SMALLINT NOT NULL, -- 认证类型 1-账号 2-qq 3-微信 4-微博 5-github
identifier VARCHAR(64) NOT NULL, -- 自己应用可以不存,第三方应用的唯一标识,微信用户名,GitHub用户名
credential VARCHAR(128) NOT NULL UNIQUE, -- 密码凭证 token或者第三方token 更改密码过后更改token
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- 时间
);
-- 分类表
DROP TABLE IF EXISTS category;
CREATE TABLE category
(
id SERIAL PRIMARY KEY,
name VARCHAR(64) NOT NULL UNIQUE, -- 版块名字
description TEXT,
sticks INT[], -- 置顶 tid...
posts INT NOT NULL DEFAULT 0, -- 版块帖子计数
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 帖子表
DROP TABLE IF EXISTS post;
CREATE TABLE post
(
id SERIAL PRIMARY KEY,
cid SMALLINT NOT NULL, -- 板块id
uid INT NOT NULL, -- 用户id
title VARCHAR(128) NOT NULL, -- 标题
content TEXT NOT NULL, -- 内容
tags TEXT[], -- 标签?-- xx?--
type SMALLINT NOT NULL DEFAULT 0, -- 0-一般 1-管理员加精华
status SMALLINT NOT NULL DEFAULT 0, -- 0-正常 1-不可回复 2-不可查看
views INT NOT NULL DEFAULT 0, -- 点击数
replys INT NOT NULL DEFAULT 0, -- 回复数
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 发表时间
updated TIMESTAMP, -- 编辑时间
CONSTRAINT f_post_cid FOREIGN KEY (cid)
REFERENCES category (id)
ON DELETE CASCADE,
CONSTRAINT f_post_uid FOREIGN KEY (uid)
REFERENCES "user" (id)
ON DELETE CASCADE
);
-- 评论表
DROP TABLE IF EXISTS comment;
CREATE TABLE comment
(
id SERIAL PRIMARY KEY,
tid INT NOT NULL, -- 帖子id
pid INT NOT NULL DEFAULT 0, -- 父评论id 0-顶层回复0+楼中楼且pid为被回复对象
uid INT NOT NULL,
tuid INT NOT NULL, -- 回复对象uid(易于查找回复我的)
content TEXT NOT NULL DEFAULT '',
replys INT NOT NULL DEFAULT 0, -- 楼中楼大于0表示有楼中楼回复
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated TIMESTAMP,
CONSTRAINT f_comment_tid FOREIGN KEY (tid)
REFERENCES post (id)
ON DELETE CASCADE,
CONSTRAINT f_comment_user FOREIGN KEY (uid)
REFERENCES "user" (id)
ON DELETE CASCADE
);
CREATE INDEX i_comment_tid
ON comment (tid);
CREATE INDEX i_comment_user
ON comment (uid);
-- 收藏表
DROP TABLE IF EXISTS star;
CREATE TABLE star
(
id SERIAL PRIMARY KEY,
uid INT NOT NULL,
tid INT NOT NULL,
comment VARCHAR(512) NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT f_star_user FOREIGN KEY (uid)
REFERENCES "user" (id)
ON DELETE CASCADE
);
CREATE UNIQUE INDEX i_star_unique
ON star (uid, tid);
-- 关注表
DROP TABLE IF EXISTS follow;
CREATE TABLE follow
(
id SERIAL PRIMARY KEY,
uid INT NOT NULL,
tuid INT NOT NULL, -- 对方uid
note TEXT, -- 备注名
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT f_follow_user FOREIGN KEY (uid)
REFERENCES user (id)
ON DELETE CASCADE,
CONSTRAINT f_follow_tuser FOREIGN KEY (tuid)
REFERENCES user (id)
ON DELETE CASCADE
);
CREATE INDEX i_follow_me
ON follow (uid);
CREATE INDEX i_follow_other
ON follow (tuid);
CREATE UNIQUE INDEX i_follow_unique
ON follow (uid, tuid);
-- 聊天表
DROP TABLE IF EXISTS chat;
CREATE TABLE chat
(
id SERIAL PRIMARY KEY,
uid INT NOT NULL, -- 我的uid 发送方
tuid INT NOT NULL, -- 对方uid
content TEXT NOT NULL,
isread BOOLEAN NOT NULL DEFAULT FALSE,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT f_chat_user FOREIGN KEY (uid)
REFERENCES user (id)
ON DELETE CASCADE,
CONSTRAINT f_chat_tuser FOREIGN KEY (tuid)
REFERENCES user (id)
ON DELETE CASCADE
);
CREATE INDEX i_chat_me
ON chat (uid);
CREATE INDEX i_chat_other
ON chat (tuid);
-- ------------------触发器定义------------------------
-- ---------------只更新计数和经验值--------------------
-- 发表帖子触发器
CREATE OR REPLACE FUNCTION func_post_add() RETURNS TRIGGER AS
$$
BEGIN
UPDATE "user"
SET exp = exp + 3,
WHERE id = new.uid;
UPDATE category
SET posts = posts + 1
WHERE id = new.cid;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER t_post_add
AFTER INSERT
ON post
FOR EACH ROW
EXECUTE PROCEDURE func_post_add();
-- 删除帖子触发器
CREATE OR REPLACE FUNCTION func_post_del() RETURNS TRIGGER AS
$$
BEGIN
UPDATE "user"
SET exp = exp - 3,
WHERE id = old.id;
UPDATE category
SET posts = posts - 1
WHERE id = old.id;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER t_post_del
AFTER DELETE
ON post
FOR EACH ROW
EXECUTE PROCEDURE func_post_del();
-- 增加评论触发器
CREATE OR REPLACE FUNCTION func_comment_add() RETURNS TRIGGER AS
$$
BEGIN
UPDATE user
SET exp = exp + 1,
WHERE id = new.id;
UPDATE post
SET replys = replys + 1,
lastreply = new.created
WHERE tid = new.tid;
IF new.pid > 0 -- 楼中楼回复
THEN
UPDATE comment
SET replys = replys + 1
WHERE id = new.pid;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER t_comment_add
AFTER INSERT
ON comment
FOR EACH ROW
EXECUTE PROCEDURE func_comment_add();
-- 删除评论触发器
CREATE OR REPLACE FUNCTION func_comment_del() RETURNS TRIGGER AS
$$
BEGIN
UPDATE user
SET exp = exp - 1,
replys = replys - 1
WHERE id = old.uid;
UPDATE post
SET replys = replys - 1
WHERE tid = old.tid
AND replys > 0;
IF new.pid > 0 THEN -- 楼中楼回复
UPDATE comment
SET replys = replys - 1
WHERE id = old.pid
AND replys > 0;
ELSEIF old.replys > 0 THEN -- 不是楼中楼回复且有子回复删除他们
DELETE
FROM comment
WHERE pid = old.id;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER t_comment_del
AFTER DELETE
ON comment
FOR EACH ROW
EXECUTE PROCEDURE func_comment_del();
-- 增加关注触发器
CREATE OR REPLACE FUNCTION func_follow_del() RETURNS TRIGGER AS
$$
BEGIN
UPDATE user
SET newfollows = newfollows + 1
WHERE id = new.tuid;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER t_follow_add
AFTER INSERT
ON follow
FOR EACH ROW
WHEN (new.uid <> new.tuid)
EXECUTE PROCEDURE func_follow_del();
-- ---------------------常见函数-------------------
-- -----------------------------------------------
-- 添加评论回复楼主
CREATE OR REPLACE FUNCTION comment_add_lz(in_tid INT, in_uid INT, in_content TEXT) RETURNS BOOLEAN AS
$$
DECLARE
tuid INT;
BEGIN
SELECT uid
INTO tuid
FROM post
WHERE id = in_tid;
IF tuid IS NOT NULL THEN
INSERT INTO COMMENT (tid, uid, tuid, content) VALUES (in_tid, in_uid, tuid, in_content) RETURNING id;
RETURN TRUE;
END IF;
RETURN FALSE;
END;
$$ LANGUAGE plpgsql;
-- 添加评论楼中楼回复
CREATE OR REPLACE FUNCTION comment_add_cz(in_tid INT, in_pid INT, in_uid INT, in_content TEXT) RETURNS BOOLEAN AS
$$
DECLARE
czuid INT;
DECLARE result BOOLEAN;
BEGIN
SET result = FALSE;
SELECT uid
INTO czuid
FROM comment
WHERE tid = in_tid
AND id = in_pid;
IF czuid IS NOT NULL THEN
INSERT INTO COMMENT (tid, pid, uid, tuid, content)
VALUES (in_tid, in_pid, in_uid, czuid, in_content)
RETURNING id;
SET result = TRUE;
END IF;
RETURN result;
END;
$$ LANGUAGE plpgsql;