案例表設(shè)計(jì)(舉例)
user : id | name | pw | ....
atc : id | title | ....
atc_tag : id | title | ...
atc_tag_ref : id | atc_id | atc_tag_id | ....
user_favor_atc_tag : id | user_id | tag_id | deleted | ...
目標(biāo)
根據(jù)用戶喜好查詢文章列表
- 翻頁(yè)邏輯
- 帶用戶喜歡標(biāo)簽的文章優(yōu)先排序
實(shí)現(xiàn)方式
方案一
當(dāng)數(shù)據(jù)量均很少時(shí),可一次查詢atc列表,然后比對(duì)其tag和用戶favor_tag。
不建議:不管數(shù)據(jù)量多少,都應(yīng)該按照完整模式來(lái)考慮問題,實(shí)際項(xiàng)目中既有可能atc是數(shù)據(jù)量大的一方,tag等也可能是數(shù)據(jù)量大的一方。
方案二
- 優(yōu)先構(gòu)建方法獲取用戶的喜歡的文章標(biāo)簽列表;
- 根據(jù)用戶喜歡的標(biāo)簽列表查詢包含此類標(biāo)簽的文章List<AtcId>
- 構(gòu)建PageSearch方法A查詢包含List<AtcId>的文章列表List<AtcFavored>,以及文章數(shù)量FavoredAtcCnt
- 構(gòu)建PageSearch方法B查詢不包含List<AtcId>的文章列表List<AtcUnFavored>,以及對(duì)應(yīng)數(shù)量UnFavoredCnt
此處使用兩個(gè)Atc表的查詢方法在于,優(yōu)先按照翻頁(yè)邏輯查詢帶用戶喜歡標(biāo)簽的文章,若在某一頁(yè)時(shí),用戶喜歡的文章不滿一頁(yè)size<PageSize,這時(shí)候就需要調(diào)用B方法來(lái)查詢不帶用戶喜歡標(biāo)簽的文章,來(lái)補(bǔ)足這一頁(yè)數(shù)據(jù)。
后續(xù)思考
實(shí)際項(xiàng)目對(duì)于類似于標(biāo)簽服務(wù)的數(shù)據(jù)庫(kù)設(shè)計(jì),盡可能不要偷懶,而將tag作為屬性加在Atc表中,不然在大量數(shù)據(jù)查詢時(shí),會(huì)造成效率低下;
實(shí)際項(xiàng)目中還需要考慮的問題諸如:Atc的創(chuàng)建時(shí)間問題、文章是否被收藏、文章的點(diǎn)贊數(shù)量等