單表查詢是互聯(lián)網(wǎng)業(yè)務(wù)中常用的手段.引入單表查詢后讥裤,數(shù)據(jù)庫負責簡單讀取數(shù)據(jù)跑筝,應用需要解決如何將查詢落到核心表上套利!
現(xiàn)有三張表:
品牌表t_brand(brand_name,brand_code),
類目表t_category(cat_name,cat_code),
產(chǎn)品表為t_product(product_name,product_code,brand_code,cat_code)
需要實現(xiàn)接口需求為:支持通過 品牌名稱悉默,類目名稱和產(chǎn)品編號進行查詢產(chǎn)品城豁。
按照傳統(tǒng)的解決方式:
select p.product_name,product_code from t_product p
join t_brand b on p.brand_code=b.brand_code
join t_catgory c on p.cat_code = c.cat_code
where b. brand_name like '%${品牌名稱}%'
and c.cat_name like '%${類目名稱}%'
and p.product_code = '${產(chǎn)品編號}'
這種方式的優(yōu)點;開發(fā)效率高,迅速支撐業(yè)務(wù)抄课。但是隨著業(yè)務(wù)的發(fā)展唱星,數(shù)據(jù)庫的數(shù)據(jù)量增加大,join的代價越來越大跟磨,數(shù)據(jù)庫的緩存使用率底下间聊。為了解決這些問題,通常引入單表查詢的方式來解決問題.
sql變成了:
select brand_code from t_brand where brand_name like '%${品牌名稱}%';
select cat_code from t_brand where cat_name like '%${類目名稱}%';
select product_name,product_code from t_product
where brand_code in ('${brandCode}')
and cat_code in ('${catCode}')
and product_code = '${產(chǎn)品編號}';
業(yè)務(wù)是不斷發(fā)展的抵拘,為了解決產(chǎn)品表的單維度的查詢哎榴,決定引入tag表,幫助運營進行多維度的檢索.tag表t_tag(tag_code,tag_name),t_tag_product(id,tag_code,product_code)
需要實現(xiàn)接口需求為:支持通過品牌名稱,類目名稱尚蝌,產(chǎn)品編號和標簽編號 進行查詢產(chǎn)品信息
sql又變成:
select brand_code from t_brand where brand_name like '%${品牌名稱}%';
select cat_code from t_brand where cat_name like '%${類目名稱}%';
select product_code from t_tag_product where tag_code = '${標簽編號}';
select product_name,product_code from t_product where brand_code in ('${brandCode}') and cat_code in ('${catCode}') and product_code = '${產(chǎn)品編號}' and product_code in('${通過tagCode找到productCode}')
但是sql查詢時時有問題迎变,比如:
1.如果產(chǎn)品編號與${通過tagCode找到productCode} 沒有交集,就不用浪費一次sql查詢飘言,直接在應用層攔截返回氏豌。
2.如果再增加一張新表sku(sku_code,product_code),同時更新接口的需求為:
支持通過品牌名稱热凹,類目名稱,產(chǎn)品編號泪电,標簽編號般妙,sku編號查詢產(chǎn)品信息。其sql也會越來越復雜相速。
select product_name,product_code from t_product
where brand_code in ('${brandCode}')
and cat_code in ('${catCode}')
and product_code = '${產(chǎn)品編號}'
and product_code in('${通過tagCode找到productCode}')
and product_code in('${通過skuCode找到productCode}')
很明顯碟渺,需要一個在應用層對productCode進行合并,并過濾無效的productCode的工具突诬。
這樣的工具苫拍,需要解決幾個問題:
1.將t_product設(shè)為主表,因為最終接口返回的產(chǎn)品信息旺隙,其他表設(shè)置為輔助表绒极,用于輔助查詢。
2.判斷用戶傳遞的輔助字段蔬捷,這些條件能否查詢到productCode垄提,并將合并為supportProductCodes。
3.處理masterProductCode與supportProductCodes的關(guān)系周拐,判斷什么時候應該攔截sql铡俐,什么時候應該合并。
有了這個工具后妥粟,sql再次得到簡化
select brand_code from t_brand where brand_name like '%xx%';
select cat_code from t_brand where cat_name like '%xx%';
select product_code from t_tag_product where tag_code = 'power';
select product_code from t_sku where sku_code = '{sku編號}'
select product_name,product_code from t_product where brand_code in ('brandcode') and cat_code in ('cat_code') and and product_code in('{合并后的productCode}')