本篇主要明確配捐系統的概念和具體實現,包括數據結構設計、邏輯關係分析等。前端
什麼是配捐?
配捐的概念誕生於1954年,由美國通用基金會創造。截止2016年,通用的總計配捐總額達到3800萬美圓。最初只是贊助員工母校的貧困學生,以後逐漸延伸到其餘公益領域,也帶動了其餘企業加入配捐大潮。json
網上釋義: 本身找吧;數據結構
個人釋義: 配捐是一種公益活動,參與用戶的某種公益行爲在知足活動合約中設定的捐款條件後,會觸發活動的參與企業以用戶的名義爲項目捐款。簡單來講就是"你出力,我出錢"。異步
常見的配捐有如下幾種形式:ui
從業務本質上來講,配捐實際上屬於一種活動,因此在作系統設計時應看成活動來設計。設計
一般「活動」是在後臺配置,包括:發佈、修改、下線、上線活動。那咱們先大概肯定下「活動」的相關數據結構。code
配捐活動的主要結構以下:對象
活動類型表「activity_type」事件
id: {type: 'integer', primaryKey: true, autoIncrement:true} //活動類型ID activityType: {type: 'string', required: true} //活動類型:分享配捐|捐款配捐|… createdAt:{type: 'timestamp', required: true}
活動類型不可刪除;
活動表「activity」圖片
id: {type: 'integer', primaryKey: true, autoIncrement:true} //活動ID activityTypeID: {type: ‘integer', required: true} //活動類型ID: activityName: {type: ‘integer', required: ture} //活動名稱, 如:分享配捐第一期 activityImages: {type: ‘text', required: false} //活動圖片/封面 startTime: {type: ‘timestamp', required: ture} //活動起始時間 endTime: {type: ‘timestamp', required: ture} //活動結束時間 createdAt: {type: 'timestamp', required: true} //活動建立時間 updatedAt: {type: 'timestamp', required: true} //活動修改時間 remark: {type: ‘text', required: false} //活動規則備註 state: {type: ‘integer', required: true} //活動狀態
配捐活動明細表「Activity_matching_gift」
id: {type: 'integer', primaryKey: true, autoIncrement:false} //活動ID donationAmount: {type: 'decimal(11,2)', required: true} //配捐金額 donationProportion: {type: 'string', required: true} //配捐比例 Donors: {type: 'string', required: true} //配捐參與企業, json字符串 {「charity1」,」charity2」,」charity3」,"…"}
後臺界面上根據活動類型加載活動明細表。
活動期間和活動結束後均不得修改活動內容,若是要修改只能夠在活動以前修改。
在具體實現時咱們還須要考慮配捐與用戶、活動、分享、訂單等系統之間的邏輯關係。既然講到實現,那咱們就要明確到底要實現什麼。
先拿「分享配捐」來講吧。從產品需求中得知有如下幾點:
實現過程當中的問題和解決方案:
其實「2」和「3」的解決方案是同一個。讓咱們進一步分析下:
用戶參與,參與什麼呢?參與活動,什麼活動呢?分享捐款活動,在活動中作了什麼事呢?分享!
企業參與,參與什麼呢?參與和用戶一樣的活動,什麼活動呢?分享捐款活動,在活動中作了什麼事呢?捐款,生成捐款訂單!
如今,咱們把用戶參與活動的事件及流程,抽象在一張「活動事件表」裏。
活動事件表「Activity_event」
id: {type: 'integer', primaryKey: true, autoIncrement:true} userID: {type: 'string', required: true} //用戶ID activityID: {type: 'integer', required: true} //活動ID activityTypeID: {type: 'integer', required: true} //活動類型ID userEventID: {type: 'integer', required: true} //用戶事件ID,這個事件多是分享也多是別的,因活動類型而定;用戶分享ID|... remark: {type: 'string', required: false} //備註 createdAt:{type: 'timestamp', required: true} state: {type: 'integer', required: true} //活動事件狀態,未完成|已完成
「活動事件表」裏即記錄了活動關係,也記錄了待處理的異步任務。後期與配捐的企業結算也須要這張表。
活動事件訂單表「Activity_event_order」
id: {type: 'integer', primaryKey: true, autoIncrement:true} eventID: {type: 'integer', primaryKey: true, autoIncrement:true} //活動事件表ID orderID: {type: 'string', required: true} // 訂單ID,若是是分享事件,那麼這裏多是用戶分享後生成的空訂單ID,也多是企業配捐的訂單ID remark: {type: 'string', required: false} //備註,好比能夠標註訂單的性質,share|matchingGift createdAt:{type: 'timestamp', required: true}
爲何須要「活動事件訂單表」呢?由於不一樣類型活動的事件,或同一種事件,今天多是對訂單有影響,明天多是對積分有影響。因此必須把具體被影響的對象抽象出來。「活動事件訂單表」表示這個「事件」是對訂單有影響,記錄的是事件和訂單的關係。
若是一個分享訂單對應有兩個企業配捐,那麼這個表一個產生3條記錄。一個用戶分享的空訂單ID,兩個企業捐款的訂單ID,三個都對應同一個事件ID。
最後 「訂單表」 關聯 「活動事件訂單表」 和 「活動事件表」 就能夠解決上面 「2」和「3」 的問題。 這樣設計的優勢就是從數據結構層作到系統解耦,既不須要修改訂單表、分享表和活動表又能夠靈活擴展。