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