如何实现分类表统计数目和详情表数量同步
在常用的 分類表 詳情表 1對多模型中,常常有統計某個分類下有多少詳情數據的,比如 某分類下有多少文章,分類表往往數據量少,可能就只有幾十條幾百條,但是詳情表會很多,幾十萬 上百萬都有可能,那么在某些詳情分類得到變更的情況下,或者說新增刪除了某個詳情記錄,分類的統計記錄又該如何統計呢?
我們這里先展示一下常用的分類詳情設計
分類表
詳情表
這是最簡單不過的1對多了,一條新聞屬于某個分類下,然后我們想統計某個分類下有多少文章,如何統計呢?
當然了,其實我們在web應用中往往希望看到分類名稱,以及該分類下的新聞數量,那么這個統計結果還是有些不太如意的,如何處理呢?
這才是我們希望看到的結果,有分類名稱,有對應該分類下統計數量
甚至還可以這樣寫
不過這樣寫在有些SQL_MODE下好像不太支持 會提示這個name isn't in GROUP BY
因為你查詢的那個字段不在分組的字段里面,所以會提示你這樣的SQL錯誤。但是無論怎樣都避免不了聯表了,如何不聯表而且能查詢到我們想要的結果呢?
我們這里舉個例子,通過分別查詢,并進行鍵值組合得到結果
?代碼如下:
?
結果如下:
這樣是通過PHP對數據進行處理得到的結果。
那么這樣的情況是通過數據庫的統計而得到的結果,如果有些時候不方便這樣每次統計又該如何做呢?
那我們已經想到了,將統計數量先緩存起來,只有在新增和刪除或者被修改的時候才更新緩存,就能拿到統計數量了。
我們可以采用很多種緩存,文件 Redis memcache等等,不過這里可以簡單的用數據庫添加字段冗余來緩存。我們將cat表改造一下
字段添加了以后 數據是空的
得想辦法把news詳情表中的統計數量同步過來,那么如何同步呢?
我們可以用查詢???select cat_id,count(id) as num from news group by cat_id;??的結果來循環更新進行同步,這是最直接最直觀的方法
結果如圖:
查看數據庫:
這是先統計結果,然后循環更新的方法,當然也可以想辦法進行join同步
update cat left join (select cat_id,count(*) as count_num from news group by cat_id) as tmp on tmp.cat_id=cat.id set cat.num=tmp.count_num;這樣數據就同步過來了。
當news詳情表有新增和刪除的時候,這個cat表里的num就要同步的加1或者減1,當news詳情表里面的cat_id被修改的時候,cat表里面的num就要相對應的同步修改之前的cat_id的num和修改之后的cat_id的num。
描述起來有些復雜,不如用代碼演示一遍
當前數據庫
?代碼如下:
?結果如下:
?數據庫如圖:
其實這里的SQL語句也可以用??select count(*) from news where cat_id=2?先統計出來 然后PHP計算統計數量+1之后,再??update cat set num=計算增加后的數量 where id=$cat_id??這樣更新
但是為什么不用呢??? 請自行結合實際業務仔細思考或者給我留言。
那么相對應的,如果有人刪除了某條詳情,cat表里的num就要減1
具體如下:
當前數據庫:
代碼如下:
結果如圖:
數據庫如圖:
我們可以看到,刪除詳情表,需要先檢查詳情是否存在,存在的話獲取詳情的cat_id,刪除詳情后針對該cat_id進行減1操作
增加和刪除都是對單條記錄受到影響,如果是修改則不一樣了,因為修改意味著當前分類的num-1,修改后的分類的num+1 ,此消彼長的概念便油然而生!
當前數據庫如下:
代碼如下:
結果如下:
數據庫如圖:
這樣就實現了舊分類減1,新分類加1的功能。
采用MySQL的字段冗余做緩存,雖然查詢起來更方便了,可是維護起來也更加復雜了。
這往往是我們實際業務開發中需要抉擇的,冗余多了,查詢方便,可是維護的力度也變大了,冗余少,范式高,查詢起來也復雜了,還是要適當冗余的好,畢竟目前大部分公司的業務中的查詢和修改所占比例中,查詢還是多一些的,用nosql做緩存的話也是很方便的,能夠鍵值對直接修改,沒有SQL這么復雜,維護力度也會稍微降低一點點,不過總體的設計上還是差別不大,具體選用哪種方式還要看我們所負責的業務和場景需要什么模型去融合去實現。
?
轉載于:https://www.cnblogs.com/lizhaoyao/p/7660819.html
總結
以上是生活随笔為你收集整理的如何实现分类表统计数目和详情表数量同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang 函数function
- 下一篇: 使用Exceptionless记录日志