一個簡單的問題:
文章分類表:
article_type(id, name, pid, num)
這個num
是該分類下的文章數量,我之前一直就是這樣的,在新增文章或者刪除文章時都會更新對應分類的num
欄位。
但是現在我覺的這好像沒有必要,因為每個文章分類下面的文章數量可以通過文章表很容易的count()
算出來,所以就覺得這個num
是多餘的了,並且編輯文章操作時還要更新article_type
表num
感覺有點煩。
我想取消這個欄位,但是又很糾結,因為,這樣以後相對的select
語句會增多,以前直接從num
取就行了,現在每次都要count()
一下,有多少個分類就要count()
幾下,感覺是不是相對於以前而言有效能問題,不太合理呢?
感覺就這麼個簡單的問題就已經涉及程式的耦合,表的範式設計等考量。
糾結,希望大神指點,謝謝!
回複內容:
一個簡單的問題:
文章分類表:
article_type(id, name, pid, num)
這個num
是該分類下的文章數量,我之前一直就是這樣的,在新增文章或者刪除文章時都會更新對應分類的num
欄位。
但是現在我覺的這好像沒有必要,因為每個文章分類下面的文章數量可以通過文章表很容易的count()
算出來,所以就覺得這個num
是多餘的了,並且編輯文章操作時還要更新article_type
表num
感覺有點煩。
我想取消這個欄位,但是又很糾結,因為,這樣以後相對的select
語句會增多,以前直接從num
取就行了,現在每次都要count()
一下,有多少個分類就要count()
幾下,感覺是不是相對於以前而言有效能問題,不太合理呢?
感覺就這麼個簡單的問題就已經涉及程式的耦合,表的範式設計等考量。
糾結,希望大神指點,謝謝!
第一,設計是遵守範式的,這代表你在設計表的初衷是儘可能少的冗餘.
第二,適當的反範式,特定的場合下嚴格的範式反而導致嚴重的效能影響,這意味著你需要在"優雅的設計"和"實用主義"之間做權衡,這一點需要根據你業務的不同來看,永遠不要追求完美.
現在來看看你的情境,你的article_type增加了num的冗餘,這種情境下,能帶給你好處的是,當文章的w比較多,而你對每一類的num的即時性要求並不是那麼高,但你又需要頻繁的在多處顯示,甚至你可能是每天或者每個小時更新一下,這時候num的冗餘是合理的,你可能會減少需要select count(*)的過程.但當你只有只有很少的地方需要這個num,那麼count完全能滿足你的要求,而且不會帶給你看得見的效能損失,這種情況下,應該要遵守範式.
考慮放棄使用num能帶給你大多的麻煩,需要重構的代碼多嗎?會不會影響到核心的邏輯?是否可以把num做到cache中去呢?