天天看點

軟考 - 08 資料庫設計

文章目錄

  • ​​題目​​
  • ​​[說明]​​
  • ​​[問題1]​​
  • ​​【答案1】​​
  • ​​[問題2]​​
  • ​​【答案2】​​
  • ​​[問題3]​​
  • ​​【答案3】​​
軟考 - 08 資料庫設計

題目

閱讀以下關于資料庫設計的叙述,在答題紙上回答問題1至問題3。

[說明]

某醫藥銷售企業因業務發展,需要建立線上藥品銷售系統,為使用者提供便捷的網際網路藥品銷售服務、該系統除了正常藥品展示、訂單、使用者交流與回報功能外,還需要提供目前熱銷産品排名、評價分類管理等功能。

通過對需求的分析,在資料管理上初步決定采用關系資料庫(MySQL)和資料庫緩存(Redis) 的混合架構實作。

經過規範化設計之後,該系統的部分資料庫表結構如下所示。

  • 供應商(供應商ID,供應商名稱,聯系方式,供應商位址) ;
  • 藥品(藥品ID,藥品名稱,藥品型号,藥品價格,供應商ID) ;
  • 藥品庫存(藥品ID,目前庫存數量) ;
  • 訂單(訂單号碼,藥品ID,供應商ID,藥品數量,訂單金額) ;

[問題1]

在系統初步運作後,發現系統資料通路性能較差。經過分析,劉工認為原來資料庫規範化設計後,關系表過于細分,造成了大量的多表關聯查詢,影響了性能。例如當使用者查詢商品資訊時,需要同時顯示該藥品的資訊、供應商的資訊、目前庫存等資訊。為此,劉工認為可以采用反規範化設計來改造藥品關系的結構,以提高查詢性能。修改後的藥品關系結構為:

藥品(藥品ID,藥品名稱,藥品型号,藥品價格,供應商ID,供應商名稱,目前庫存數量) ;

請用200字以内的文字說明常見的反規範化設計方法,并說明使用者查詢商品資訊應該采用哪種反規範化設計方法。

【答案1】

常用的反規範技術有增加備援列、增加派生列、重新組表和分割表。

  • (1)增加備援列。是指在多個表中具有相同的列,它常用來在查詢時避免連接配接操作。
  • (2)增加派生列。指增加的列來自其它表中的資料,由它們計算生成。它的作用是在查詢時減少連接配接操作,避免使用聚集函數。
  • (3)重新組表。指如果許多使用者需要檢視兩個表連接配接出來的結果資料,則把這兩個表重新組成一個表來減少連接配接而提高性能。
  • (4)對表做分割可以提高性能。表分割有兩種方式∶水準分割和垂直分割

使用者查詢商品資訊應該采用增加備援列的方式。

[問題2]

王工認為,反規範化設計可提高查詢的性能,但必然會帶來資料的不一緻性問題。請用200字以内的文字說明在反規範化設計中,解決資料不一緻性問題的三種常見方法,并說明該系統應該采用哪種方法。

【答案2】

解決資料不一緻性問題常用的方法是批處理維護、應用邏輯和觸發器。

● 批處理維護是指對複制列或派生列的修改積累一定的時間後,運作一批處理作業或存儲過程對複制或派生列進行修改,隻能在對實時性要求不高的情況下使用。

● 應用邏輯實作資料一緻性就要求必須在同一事務中對所有涉及的表進行同步增、删、改操作。同一邏輯必須在所有的應用中使用和維護,容易遺漏,不易于維護。

● 觸發器∶對資料的任何修改立即觸發對複制列或派生列的相應修改。觸發器是實時的,易于維護,是解決這類問題的最好的辦法。該系統應該采用觸發器。

[問題3]

該系統采用了Redis來實作某些特定功能(如目前熱銷藥品排名等),同時将藥品關系資料放到記憶體以提高商品查詢的性能,但必然會造成Redis和MySQL的資料實時同步問題。

(1) Redis的資料類型包括String、 Hash、 List、 Set和ZSet等,請說明實作目前熱銷藥品排名的功能應該選擇使用哪種資料類型。

(2)請用200字以内的文字解釋說明解決Redis和MySQL資料實時同步問題的常見方案。

【答案3】

(1)

熱銷藥品排名适合用∶ZSet (解析∶zset 和 set 類似,都是存儲無序不重複的資料。但是 zset 會帶有一個分數 score,可以根據score 去排序。)

(2)

1.對強一緻要求比較高的,應采用實時同步方案,即查詢緩存查詢不到再從資料庫中查詢,然後儲存到緩存;更新緩存時,先更新資料庫,再将緩存的設定過期(建議不要去更新緩存内容,直接設定緩存過期)。

2.對于并發程度較高的,可采用異步隊列的方式同步,可采用kafka等消息中間件處理消息生産和消費。