2012-12-05 68 views
1

我需要一個表來記錄用戶在WordPress中執行的某些操作。用於在WordPress中記錄用戶操作的數據庫設計

截至目前,這是數據庫模式我有陣營了:

id bigint(20) NOT NULL AUTO_INCREMENT, 
uid bigint(20) NOT NULL, 
type VARCHAR(256) NOT NULL, 
data1 TEXT NOT NULL, 
data2 TEXT NOT NULL, 
data3 TEXT NOT NULL, 
timestamp bigint(20) NOT NULL, 
UNIQUE KEY id (id) 

讓我澄清一下:

uid: User ID of the wordpress user 
type: Type of action the user made (can be 'comment', 'new_post', 'login', etc) 
data1/2/3: additional data (for example, ID of comment or post made) 

要顯示的日誌,我就查詢數據庫,並貫穿一個特定的過濾器來獲取文本顯示爲特定的日誌。所以它的工作原理是這樣的:

if($type == 'comment') { 
    $comment = get_comment($data1); 
    $user = get_user($uid); 
    echo "User {$user->name} has made a <a href='{$comment->permalink}'>comment</a>"; 
} 

這是最有效的做事方式嗎?對我來說這似乎相當不錯,因爲我不想將HTML存儲在日誌表中以便輸出。

但是,問題出現在我想要在特定條件滿足時隱藏特定日誌條目的地方。例如,如果評論不再存在,我想隱藏該條目。這會導致分頁問題。關於如何克服這一點的任何建議?

謝謝!

編輯:

myplugin_transactions 
id bigint(20) NOT NULL AUTO_INCREMENT, 
user_id bigint(20) NOT NULL, 
type VARCHAR(256) NOT NULL, 
timestamp bigint(20) NOT NULL, 
UNIQUE KEY id (id) 

myplugin_meta 
id bigint(20) NOT NULL AUTO_INCREMENT, 
txn_id bigint(20) NOT NULL, 
key VARCHAR(256) NOT NULL, 
data TEXT NOT NULL, 
UNIQUE KEY id (id) 

可以說,我想從那裏myplugin_transactions DATA1通常會不得不被 'x' 和數據2被 'Y' 選擇*。在這種情況下我應該怎麼做?

SELECT * FROM myplugin_transactions LEFT JOIN myplugin_meta ON myplugin_transactions.id = myplugin_meta.txn_id WHERE (... ?) 
+1

您的數據類型可能會更好。你真的需要'BIGINT'作爲'user_id'嗎?你預計有超過40億用戶嗎? 'timestamp'列應該是'TIMESTAMP'類型。儘量避免使用'TEXT'類型;它會強制任何分類在磁盤上完成。除非你真的需要超過255個字符,否則使用'VARCHAR(255)'。主表上的'type'列應該是'VARCHAR(255)',因爲它使256增加了一個額外的字節。這些更改可以顯着減少數據和索引的大小。 –

+0

@ G-Nugget感謝您對VARCHAR(255)與VARCHAR(256)之間的性能差異的意見。如果我使用TIMESTAMP類型,是否會有性能改進?我還選擇了BIGINT而不是INT,因爲它符合WordPress數據庫模式(http://codex.wordpress.org/Database_Description/3.3#Table:_wp_users)。他們可能使用BIGINT來實現可伸縮性。我是一名插件開發人員,這是爲公衆考慮編寫的。我應該使用INT還是堅持BIGINT? – mushroom

+0

如果你一致,我想可以使用'BIGINT'。時間戳值實際上會是什麼?它會是一個unix時間戳或格式化的日期?此外,它將始終是行插入到表中還是其他時間?你也應該讓你'INT'類型字段'UNSIGNED';使用'BIGINT',你可能不會注意到任何區別,但這是正確的。 –

回答

1

這個答案將是非常通用的,因爲它不提供任何代碼,但它也太長了評論。

首先,您不應該在data1,data2,0 data3字段中存儲其他數據。你正在使用MySQL,所以你擁有關係數據庫的力量。使用它們。

你應該只有另一個表,它有一個ID字段(操作的ID)和一個數據字段。這樣,您可以將0存儲爲「儘可能多」的元數據。我的意思是,wordpress已經用元數據做到這一點了嗎?其次,如果評論被刪除,你是否只想刪除與其相關的操作?如果是這樣,只需鉤入API。我相信有一個鉤子delete_commenthttp://codex.wordpress.org/Plugin_API/Action_Reference#Comment.2C_Ping.2C_and_Trackback_Actions

否則,如果你想保留這個動作,你可以添加一個額外的字段或稱爲deleted的一段元數據。當刪除評論時,如上所示:掛斷delete_comment呼叫並將動作更新爲deleted = true。然後,當你在所有的操作運行查詢,排除了被刪除的語句,如... WHERE deleted = NULL ...

EDIT2:

要回答你的SELECT語句,像這樣可以工作:

SELECT * FROM myplugin_transactions 
LEFT JOIN myplugin_meta AS data1 
ON (myplugin_transactions.id = data1.txn_id AND data1.key = 'data1') 
LEFT JOIN myplugin_meta AS data2 
ON (myplugin_transactions.id = data2.txn_id AND data2.key = 'data2') 
WHERE data1.data = 'x' 
AND data2.data = 'y' 

顯然用有意義的描述替換data1data2關鍵字。

+0

感謝您關於使用次表進行無限多的附加數據的想法。至於第二部分,我不想刪除日誌條目,而只是在滿足特定條件時將其從用戶視圖中隱藏起來,但是他們會混淆分頁,因爲如果有一個條目可能會在10頁上出現9個條目被過濾掉。 – mushroom

+0

我明白了,我已經更新了我的答案。 –

+0

謝謝,這是一個非常好的建議。我編輯了我的問題,關於如何根據建議的模式查詢某些內容。 – mushroom