2009-07-10 20 views
0

我正在使用MS SQL Server 2005.高性能wiki架構

Wiki-like系統的最佳模式是什麼?其中用戶編輯/修改提交,系統跟蹤這些提交。

可以說我們正在做一個簡單的基於wiki的系統。將跟蹤每個修訂版加上每個修訂版的視圖和最新活動。在其他屏幕中,系統將列出「最新提交內容」和「最受關注」,再加上標題搜索。

我目前的模式(我知道它的不好)正在使用一個表。當我需要查看「最新提交內容」時,我按「最新活動」進行排序,按「DocumentTitle」進行分組,然後取第N條記錄。我假設很多分組(特別是在nvarchar上分組)是壞消息。對於列表最多的觀看,我也做同樣的事情:按照視圖排序,按名稱分組,取第N個記錄。大多數時候,我也會做一個「WHERE DocumentName LIKE'%QUERY-HERE%'」。

我現在的模式是 「第1版」,見下圖: alt text http://www.anaimi.com/junk/schemaquestion.png

我認爲這是不能接受的。所以我試圖想出另一個/更高性能的設計。版本2如何響應你?在版本二中,我獲得了在WikiHeadId上分組的優勢,這是一個數字 - 我假設分組數量比nvarchar更好。

或者是3版本,在那裏我會做沒有分組,但有幾個缺點,如複製值,維持這些代碼值等

或者有更好的/知模式的極端情況對於這樣的系統?

謝謝。

(從ServerFault感動 - 我認爲這是一個發展的問題不是一個IT問題,更多)

回答

2

首先(出於好奇)當前模式如何指示當前版本是什麼?你是否有多個具有相同DocumentTitle的'WikiDocument'條目?

我還不清楚爲什麼你需要版本級別的'LastActivity'。我沒有看到'LastActivity'如何符合'版本'的概念 - 在大多數維基上,'版本'是一次編寫的:如果您修改版本,那麼您將創建一個新的版本,所以版本上最後更新的類型值的概念是沒有意義的 - 它實際上只是'創建日期'。

真的,你設計的'自然'模式是#2。就我個人而言,我對舊的DB公理的規範有點「正常化,直到它傷害,然後非規範化,直到它工作」。 #2是一個更清潔,更好的設計(簡單,沒有重複),並且如果你沒有任何緊急理由去規範版本3,我不會打擾。最終,它歸結爲:你是否擔心'性能更高'的設計,因爲你觀察到性能問題,或者你假設可能有有一些?沒有真正的原因#2應該表現不好。在SQL Server中分組並不一定是個壞消息 - 事實上,如果查詢有合適的覆蓋索引,它可以執行得非常好,因爲它可以導航到索引中的特定級別以查找分組值,然後使用索引的其餘列用於MIN/MAX /其他。通過NVARCHAR分組並不是特別糟糕 - 如果沒有發現問題,請不要擔心,儘管(非二進制)排序規則可能會使其有點棘手 - 但在版本2中,您需要GROUP BY你可以通過WikiHeadId來完成,對嗎?

有一件事可能會讓生活變得更容易,如果您對當前版本進行了大量操作(就像我認爲的那樣),將FK從頭表添加到主體表中,表明當前版本。如果你想查看當前版本與命中次數最多,以#2,因爲它代表現在,它可能是:

SELECT TOP ... 
FROM WikiHead 
INNER JOIN 
    (SELECT WikiHeadId, MAX(WikiBodyVersion) /* or LastUpdated? */ AS Latest 
    FROM WikiBody GROUP BY WikiHeadId) AS LatestVersions 
INNER JOIN WikiBody ON 
    (Latest.WikiHeadId = WikiBody.WikiHeadId) 
    AND (WikiBody.WikiBodyVersion = LatestVersions.Latest) 
ORDER BY 
    Views DESC 

或可替代

... 
INNER JOIN WikiBody ON 
    (WikiHead.WikiHeadId = WikiBody.WikiHeadId) 
    AND (WikiBody.WikiBodyVersion = 
    (SELECT MAX(WikiBodyVersion) FROM WikiBody WHERE WikiBody.WikiHeadId = WikiHead.WikiHeadId) 
... 

這兩者都是甜的。如果WikiHead保持一個指向當前的版本,它只是

...  
INNER JOIN WikiBody ON 
    (WikiHead.WikiHeadId = WikiBody.WikiHeadId) 
    AND (WikiHead.Latest = WikiBody.WikiBodyVersion) 
... 

或什麼的,這可能是一種有用的非正規化,只是因爲它使你的生活更輕鬆,而不是性能。

+0

謝謝。在版本1中,我忘記了「版本」屬性。但無論如何,我已將其重新實現爲使用第2版。 – ANaimi 2009-07-16 10:09:29

0

檢查this出來。

這是mediawiki的數據庫架構,維基百科基於什麼。

它看起來很好記錄,將是一個有趣的讀取你。

從這個page