需求概述優化
一個簡單的討論區系統,須要有用戶,用戶組,組討論區這三部分基本功能spa
簡要分析ip
1) 需要存放用戶數據的表;ci
2) 需要存放分組信息和用戶與組關係的表;it
3) 需要存放討論信息的表io
解決方案table
原始方案一: ast
分別用4個表來存放用戶,用戶組,用戶與組關係,以及各組的討論帖子的信息。email
user用戶表date
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int(11) |
NO |
|
|
|
nick_name |
varchar(32) |
NO |
|
NULL |
|
password |
char(64) |
YES |
|
NULL |
|
|
varchar(32) |
NO |
|
NULL |
|
status |
varchar(16) |
NO |
|
NULL |
|
sexuality |
char(1) |
NO |
|
NULL |
|
msn |
varchar(32) |
YES |
|
NULL |
|
sign |
varchar(64) |
YES |
|
NULL |
|
brithday |
date |
YES |
|
NULL |
|
hobby |
varchar(64) |
YES |
|
NULL |
|
location |
varchar(64) |
YES |
|
NULL |
|
description |
varchar(1024) |
YES |
|
NULL |
|
groups分組表
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int(11) |
NO |
|
|
|
gmt_create |
datetime |
NO |
|
NULL |
|
gmt_modified |
datetime |
NO |
|
NULL |
|
name |
varchar(32) |
NO |
|
NULL |
|
status |
varchar(16) |
NO |
|
NULL |
|
description |
varchar(1024) |
YES |
|
NULL |
|
user_group關係表
Field |
Type |
Null |
Key |
Default |
Extra |
user_id |
int(11) |
NO |
MUL |
NULL |
|
group_id |
int(11) |
NO |
MUL |
NULL |
|
user_type |
int(11) |
NO |
|
NULL |
|
gmt_create |
datetime |
NO |
|
NULL |
|
gmt_modified |
datetime |
NO |
|
NULL |
|
status |
varchar(16) |
NO |
|
NULL |
|
group_message討論組帖子表
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int(11) |
NO |
|
NULL |
|
gmt_create |
datetime |
NO |
|
NULL |
|
gmt_modified |
datetime |
NO |
|
NULL |
|
group_id |
int(11) |
NO |
|
NULL |
|
user_id |
int(11) |
NO |
|
NULL |
|
subject |
varchar(128) |
NO |
|
NULL |
|
content |
text |
YES |
|
NULL |
|
優化後方案二以下
user用戶表分紅user用戶表與user_profile表
group_message討論組表分紅group_message討論組與group_message_content
user用戶表
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int(11) |
NO |
|
|
|
nick_name |
varchar(32) |
NO |
|
NULL |
|
password |
char(64) |
YES |
|
NULL |
|
|
varchar(32) |
NO |
|
NULL |
|
status |
varchar(16) |
NO |
|
NULL |
|
user_profile用戶屬性表
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int(11) |
NO |
|
|
|
sexuality |
char(1) |
NO |
|
NULL |
|
msn |
varchar(32) |
YES |
|
NULL |
|
sign |
varchar(64) |
YES |
|
NULL |
|
brithday |
date |
YES |
|
NULL |
|
hobby |
varchar(64) |
YES |
|
NULL |
|
location |
varchar(64) |
YES |
|
NULL |
|
description |
varchar(1024) |
YES |
|
NULL |
|
group_message討論組帖子表
Field |
Type |
Null |
Key |
Default |
Extra |
id |
int(11) |
NO |
|
NULL |
|
gmt_create |
datetime |
NO |
|
NULL |
|
gmt_modified |
datetime |
NO |
|
NULL |
|
group_id |
int(11) |
NO |
|
NULL |
|
user_id |
int(11) |
NO |
|
NULL |
|
subject |
varchar(128) |
NO |
|
NULL |
|
author |
varchar(32) |
NO |
|
NULL |
|
group_message_content帖子內容表
Field |
Type |
Null |
Key |
Default |
Extra |
group_msg_id |
int(11) |
NO |
|
|
|
content |
text |
NO |
|
NULL |
|
分析考慮:
1. 從實際出發,一個討論區系統,訪問最多的頁面應該是帖子標題列表頁面。而帖子標題列表頁面最主要的信息都來自於group_message表中,同時帖子標題後面的做者通常都是經過用戶名(暱稱)來展現。所以:
1) 按照第一種解決方案:
SELECT t.id, t.subject, user.id, u.nick_name
FROM
(
SELECT id, user_id, subject
FROM group_message
WHERE group_id = ?
ORDER BY gmt_modified DESC LIMIT 20
) t, user u
WHERE t.user_id = u.id
2) 按照第二種解決方案:
SELECT t.id, t.subject, t.user_id, t.author
FROM group_message t
HWERE group_id = ?
ORDER BY gmt_modified DESC LIMIT 20
兩個查詢一比較,打攪就能很明顯地看出誰優誰劣了。
2. 因爲第一方案中的group_message 表中還包含一個大字段’content’,該字段存放的信息要佔整個表的絕大部分存儲空間,但在1中表現的最頻繁的Query徹底不須要該字段所存放的信息,因此,形成了Query讀取大量沒有任何意義的數據。所以,須要把content字段單獨分出來存放在group_message_content帖子內容表中。