2012-02-28 75 views
3

我認爲有必要爲用戶通知取消規範化數據庫。例如,在標記帖子(應由用戶考慮)時,我們添加一列flag ENUM('yes', 'no')(或狀態欄)。爲用戶查找標記的事件可以通過使用user_id='XX' AND flag='yes'的WHERE子句進行計數。如何爲用戶通知取消規範化mysql數據庫?

這種標準化的結構很好;但是如果我們有不同類型的通知呢?例如標記的帖子,評論,照片......這意味着我們需要在用戶剛剛訪問他的個人資料頁面時計數幾張表格。這對於像stackexchange這樣的交叉項目更爲嚴重,因爲我們爲不同的網站收到通知。

我覺得去正常化可以幫助通知列作爲

post_flags tinyint(3), 
comment_flags tinyint(3), 
photo_flags tinyint(3), 

添加到用戶表在這種情況下,我們需要爲每個相應的行動更新用戶標誌列行進的額外寫入查詢。例如,標記帖子時:UPDATE users SET post_flags=post_flags+1 WHERE user_id='XX'。我擔心的是確保執行後一個查詢,以避免此數字與標記的帖子數量之間的不匹配;但我認爲可以通過TRANSACTION來保證。

通過這種方式,我們可以通過一次查詢獲取所有通知,查看經常訪問的個人資料頁面。

我在正確的軌道上嗎?或者另一個棘手的方法是常見的這個目的?

+0

你打算在'tinyint(3)'中存儲什麼?沒有多個條目? – 2012-02-28 13:23:58

+0

通知的數量。例如,在標記帖子時,我們將運行查詢UPDATE users SET post_flags = post_flags + 1 WHERE user_id ='XX'' – Googlebot 2012-02-28 13:31:29

+0

「flag ENUM('yes','no')」 - 爲什麼不使用1和0的INT ? – Ivan 2012-02-28 13:45:33

回答

1

你可能會更好用戶通知表。

create table user_notifications (
    user_id integer primary key, -- ? references users, not shown 
    post_flags unsigned tinyint(3) not null default 0, 
    comment_flags unsigned tinyint(3) not null default 0, 
    photo_flags unsigned tinyint(3) not null default 0 
); 

一個單獨的,較窄的表是邏輯和(可能)更快。無符號的標誌,因爲那裏的負數沒有意義,並且MySQL不強制執行CHECK約束。

就規範化而言,user_notifications在5NF中。

+0

好的設計,但我不確定是否真的有必要將用戶和用戶通知分成兩列,因爲通知可以添加到用戶列中。由於它們是'tinyint',它們在表格結構中會很小(即使有很多通知)。 – Googlebot 2012-03-04 15:08:56

+1

任何*可以*添加到表格「用戶」。這不是問題。你應該問的問題是這些標誌是否包含關於用戶的信息或關於其他的信息。顯而易見的答案是它們包含其他信息。 (關於通知的信息。)因此,它們在邏輯上屬於不同的表格。這個較窄的表格會讓更多的行適合頁面,因此您需要從磁盤讀取更少的頁面 - 可能會減少很多頁面。這意味着「更快」。 (在我的沙盒中,選擇一行空閒緩存大約快1000倍 - 0.05ms vs 34.5ms。) – 2012-03-04 18:38:50

1

這是否正常化?看起來創建這三列是一種更好的組織方式,對我來說更加正常?

+0

這裏的一個很好的例子就是平衡。查看某些人的交易記錄花費很大,因此記住「平衡」意味着您只有一個地方可以看。我認爲你的軌道上! – Luc 2012-02-28 13:31:53

+1

我認爲這是反規範化,因爲我們正在存儲多餘的數據! – Googlebot 2012-02-28 13:34:03

+0

嗯好點。我認爲你的設計很好。由於需要的查找量很大,彙總數據對用戶帳戶很有用。另一個例子是我們跟蹤的配置文件訪問。我計算這些數據,但也將它們存儲在一個子表中。在他們的配置文件頁面中,獲取一個int值的速度要快得多。 – Luc 2012-02-28 13:44:02

0

我不認爲這是非常有效的。當你需要查找標誌的組合時,也許它很有用,例如post_flags或者comment_flags或者photo_flags,並且查詢的順序也很重要。

+0

在配置文件頁面中,我們需要顯示一個用戶的所有標誌的數量。這意味着,我們需要爲每個表(帖子,評論,標誌)計數查詢。 – Googlebot 2012-02-28 13:37:19

+0

是的,爲什麼不!我認爲主持人可以遷移問題。 – Googlebot 2012-02-28 13:55:20