本文結合實戰經驗,列舉了資料庫設計中一般容易犯的錯誤,以及產生的後果。b端產品的資料庫設計究竟有多重要呢?怎麼說呢,如果產品定位決定了乙個產品有沒有市場,那麼資料庫的設計很多時候決定了這個產品能夠走多遠的問題,資料庫的設計合理性是乙個產品好壞最重要的指標之一。關於資料庫設計步驟以及規範的技術文章已經很多了,今天我更多偏產品以及業務層面來解釋一下其重要性。
有些從c端轉型來做b端的產品技術人可能會不以為然,資料庫設計有這麼重要嗎?
實際上b端產品資料庫設計的合理性要比c端產品資料庫設計的合理性重要很多,c端產品一般來說業務相對簡單,資料之間的耦合度低,很多用非關係型資料來進行支援,資料庫的設計相對簡單,即使前期設計不當,後期調整起來問題也影響不大。而b端產品,業務複雜,資料關係聯絡也多,一般用關係型資料庫來進行支援,設計好乙個複雜b端產品的資料庫結構,難度是不小的。
資料庫設計一般容易犯哪些錯誤以及產生哪些後果呢,我在這裡說明幾個常見的非技術規範方面的問題:
在to c產品設計的時候,我們為了資料的讀取速度,避免關聯**讀取資訊,**裡面放置大量的冗餘資訊字段。
在to b場景中,往往資料量不如to c,大多數情況效能不會成為瓶頸,如果放置很多冗餘字段,會導致後端邏輯的耦合度極其高,後續的可擴充套件性以及維護成本極高(b端產品因為業務複雜,可擴充套件性以及可維護性是極其關鍵的指標)。這裡面說的冗餘字段主要包含二類:
屬性字段需要和什麼物件關聯需要反覆斟酌,比如說在erp中,常見物件有商品,顧客,訂單,庫存等等,哪一些屬性字段放在哪個業務物件是最合適?是否需要抽象出新的物件來放置屬性字段,這裡面衡量各種方案的乙個原則就是,看哪個方案最終可以讓綜合資料量最小,一般來說就是最佳方案。
對應關係一旦錯誤,已經有客戶上線之後,後續要調整,涉及到老客戶的資料遷移,是極其痛苦的。常見的,比如說使用者與角色的對應關係,如果使用者角色前期設定了一對一的關係,在複雜業務系統中,使用者許可權複雜的時候,很有可能最終導致需要設定大量角色來滿足使用者功能許可權的需求。如果允許一對多的關係,只需要配置幾個可以組合成所有使用者許可權的基本角色就可以了。
經常看到的模式,是需求人員拿到需求以後給到開發人員,說我需要乙個什麼功能,然後開發人員考慮一下實現方式,很隨意的增加了幾個字段。這個功能應該做嗎(對於功能優先順序的判斷,請參考前面一篇文章《如何定義b端產品的mvp》上、下)?應該做成怎樣才是最佳方案?資料庫對未來業務的相容性如何?這些內容都沒有考慮,如此持續研發多年,離乙個好產品就越來越遠了。
這裡有乙個原則要注意的就是,資料庫不要隨意的增加字段,每個字段或者**的增加要極其謹慎,因為對於產品來說,增加字段容易,對於老的版本相容性是沒有問題。但是如果一旦增加了字段,後面要去掉或者調整,難度極大,這裡面的工作量包括使用者資料的遷移,以及原來邏輯中涉及到需要調整的字段的部分。
另外對於saas產品來說,一些基本資料,比如說城市,戶口型別,國家,以及一些國家,地方規定的政策等規則或者引數,這樣的資料不要做成跟客戶掛鉤的資料,盡量做成跨客戶的基本資料表,這樣做好處,一是資料可以統一,將來統計的時候極其方便,第二是如果需要更新,一次性更新就可以了,不需要一家家客戶的去進行更新。
資料庫的設計不當,會經常導致後續在面對新增業務的時候,很難用一套資料結構來支援多種業務情況,如果因此而產生了多個產品版本,就會比較糟糕了,會有如下後果:
維護多個產品版本成本很高,如果想要統一版本涉及資料遷移,使用者教育等等,難度極大。
現在都在努力挖掘客戶資料的價值,如果資料庫不統一,後續在做跨客戶的資料分析或者統計的時候難度極大。
和外部第三方合作需要建立標準介面難度大。
人員流動導致除了最新版本,沒有人知道老版本的功能是怎樣的。
老使用者體驗差,口碑很難維持。運營部門在客戶服務的時候碰到極大難度,使用者的流失率會大大增加。
上面的這些情況綜合的結果,上線的客戶越多,最後產品越走不動,所有的研發力量只能進行版本的維護,以及小修小改。當然這樣的團隊繼續做大規模的產品開發,也是不太合適的。如果已經產品面臨這樣的情況,應該怎樣來應對,後續我們再來寫對應文章進行分析。
最後要說的一點就是,現在很多公司的資料庫設計都在放在下面的普通開發身上,對於這樣核心關鍵的內容,建議要最好的人類似dataarchitect的角色來把關,如果沒有類似能力的角色,資料庫的設計要經常有架構師,核心開發,產品經理等人組成小組來週期性的進行討論和檢查。
題圖來自unsplash, 基於cc0協議。
資料庫設計 設計資料庫之前
1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...
資料庫設計 設計資料庫之前
1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...
資料庫設計 設計資料庫之前
1.考察現有環境 在設計乙個新資料庫時,你不但應該仔細研究業務需求而且還要考察現有的系統。大多數資料庫 專案都不是從頭開始建立的 通常,機構內總會存在用來滿足特定需求的現有系統 可能沒有實 現自動計算 顯然,現有系統並不完美,否則你就不必再建立新系統了。但是對舊系統的研究 可以讓你發現一些可能會忽略...