2009-05-01 121 views
3

我正在使用ASP.net和SQL數據庫。我有一個博客喜歡系統,其中一些評論是針對一個帖子進行的,我想顯示帖子旁邊的評論數量。爲了得到這個數字,我可以將它保存在帖子記錄中,並在添加或刪除評論時添加/減去,或者我可以在用戶每次點擊頁面時使用SQL來計算查詢的數量。後者似乎是一個壞主意,因爲它會打擊我的SQL數據庫更困難,但保持數字對記錄感覺像它可能容易出錯。你認爲在這種情況下最好的編碼實踐是什麼?計算評論數/帖子數

回答

3

總是從規範化的數據庫開始(第二個選項)。如果您對性能原因有絕對必要性,則必須進行非規範化處理。以非規範化的方式進行設計(如您猜測的那樣容易出錯)是不成熟的優化。有了適當的指數,它應該很好地計算飛行中的數字。

+1

我喜歡這個答案與Jesse Brown的答案相結合:非規範化將是「你已有的數據重複」。 – Travis 2009-05-01 20:48:04

2

我認爲SQL語句應該沒問題。另一個是你已有的數據重複。計數查詢應該很快。

2

不要過早優化。僅在需要時纔在優化中使用簡單的解決方案和頁面錯誤。

1

我會查詢數據庫每次你想要的信息。如果您發現性能不足(稍後優化),我會在稍後重新訪問它。對於大多數博客類型應用程序將獲得的流量來說,這應該足夠了。

0

根據您的數據模型的外觀...不要將總髮布數添加到主線程記錄中,這是容易出錯的,您應根據線程ID計算需要的註釋數,恕我直言

0

如果您擔心發生針對db的查詢次數,緩存頁面並更新該緩存作爲註釋被添加/刪除將是一個很好的選擇長SQL查詢。

1

也許得到作爲主線程查詢的一部分進行計數,以便限制來自Web服務器的實際數據庫的點擊次數。但是我會一直查詢實際數量,而不是試圖將其保留在一個領域,數據最終會失去同步,因爲這是現實。

0

我通常使用索引視圖這種事情。這使您可以對數據進行非規範化處理以進行快速檢索,但無法使其不同步。人們也不會感到困惑,並認爲該觀點是數據的主人。我主要使用SS2K5的標準sku,所以我必須指定(noexpand)提示才能真正使用視圖上的索引(企業會自動執行此操作)。所以對於標準的sku,我總是創建一個每個人都打的包裝視圖,所以我知道這個提示總是存在。

網頁上的編碼本,所以希望沒有語法錯誤;)

create view postCount__ 
as 
select 
    threadId 
    ,postCount=count_big(*) 
from thread 
group by threadId 
go 
create unique clustered index postCount__xpk_threadid on postCount__(threadId) 
go 
create view postCount 
as 
select 
    threadId 
    ,postCount=cast(postCount as int) 
from postCount__ with (noexpand) 
go 

於是我就用實際索引視圖中的命名讓大家知道不直接查詢。相反,他們會查找強制執行noexpand提示的關聯包裝視圖。使用索引視圖迫使你執行count_big,所以我經常在包裝視圖中將其轉換爲int,以便能夠使用32位整數來持久保留我們的asp.net代碼。省略演員會更好,但對我來說沒有任何重大影響。

編輯 - 我可以告訴你,論壇軟件總是非規範化帖子數到線程表。如果你有一個活躍的論壇,它會殺死數據庫以不斷計算每個頁面視圖的帖子數量。我喜歡mssql對索引進行索引,因此您可以聲明性地定義非規範化,而不是自己維護它。

1

爲了提高性能,您可以在主表中保留一個標記,以指示該項目是否有任何評論,但僅將其用作'提示',以指示是否執行額外的查詢來計算並檢索評論以後的時間。

想象一下,照片庫會返回50張照片來旋轉。每張照片都可以有自己的評論。

初始頁面加載將返回一張照片列表以及一個指示照片是否有評論的標誌。

當顯示照片時,如果評論標誌設置爲True,您的應用程序將發出ajax請求來計算並獲取該照片的評論。

如果50張照片中只有3張有評論,那麼您只需要保存47個附加請求!

這確實使數據非規格化,但在有限的水平上。 創建提示確實可以幫助提高非常繁忙的站點的性能。