亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

小項目之數據庫設計經驗分享

系統 2349 0

????? 背景:

????? 最近給客戶做了一個小工具,主要是為了減輕客戶那邊的工作壓力,一般公司都有很多自己的業務數據需要定期發給自己的員工,比如各種指標數據,績效評比等, 大多都是按公司的組織結構來,一級一級往下發,領導接收的數據一般會包含自己下一級人員的數據,所以客戶這邊也不例外,每次到了一定的周期(每周,每月或者每季度),就會由專業人員將一份完整的數據分別按組織結構一級一級往下發,全體領導基本都需要做這件事。
?????
????? 于時,我們需要給領導做一個自動分發數據的工具,將這些數據按一定要求自動的發送到各自人的郵箱中,需求給簡單,就是發郵件,從程序功能上講也就分三部分:
????? 1:解析數據源并加載到數據庫中
????? 2:提取數據并發送郵件
????? 3:將發送結果反饋給指定的人
?????
????? 之前我們一致認為數據源是穩定的,數據源格式是excel,里面的sheet名稱及數量是固定的,字段也是固定的(字段數量以及名稱),所以我們有一種非常簡單的做法,就是將excel的每個sheet映射成數據庫中的一張表,表字段和excel字段一一對應即可,最后根據不同的業務數據需求,構建不同的郵件模塊,最后實現郵件發送。
?????
????? 問題:
????? 但有一天,我們的客戶負責人發生了變更,他提出了一個問題:如果以后發送的數據發生變化,你們的軟件能支持嗎,比如今年我們的excel發送的是10個指標數據,明年如果想再增加5個或者重新替換原來的指標。
?????
????? 由于我們對此工具的定位非常低,及不用花太大代價在小工具上,盡早用上盡早減輕客戶工作量,同時也會降低開發成本,當時我們理解為數據源不會輕易發生變化,所以設計了上面的解決方案,及不支持數據的動態變更。但新的負責人提出了我們的方案不夠靈活,可擴展性,可配置性稍弱,為此我們不得不重新設計方案以支持指標數據的動態變化需求,哎,怎么說呢,如果我們給客戶想的多想的全,他們也有可能說,就一小工具不用這么復雜吧,總之既然問題提出我們就需要想辦法及解決呀。
?????
????? 習慣性思維產生的解決方案:
????? 動態構建數據表,及首先解析每個sheet有多少列,然后將這些列信息映射為數據庫表,這個方案有如下缺點:
????? 缺點一:sheet的列名需要特殊處理才行,我們需要在前面增加 []標識,以防止字符不符合表字段要求;
????? 缺點二:理論上數據庫表的列最大數沒有excel的大,即在某種極端的情況下,無法容納所有excel列數據;
????? 缺點三:在數據庫查詢上不方便,因為字段都是未知的;
????? 缺點四:在綁定email模板(email模板是用xlst來做的)上也是個問題,同樣也是字段都是未知的;
????? 缺點五:每次導入數據都需要全部刪除數據庫中的表,然后重建,這會帶來一些不可控的因素。
?????
????? 我同事最終設計了一套表結構,能夠非常完善的解決我們所遇到的問題,且結構非常簡單。
??????
????? 完美解決方案:
????? 將每個sheet的數據分解為三部分:
????? 1:列信息表Column,主要記錄列名稱
????? 2:行信息表Row,主要記錄行號
????? 3:數值信息Data,以列坐標以及行坐標能夠在sheet上唯一確定一個數據,這里記錄數據信息。
?????

??????數據庫表結構圖如下:

??????????????????????????????????????????? 小項目之數據庫設計經驗分享
????? 方案分析:
????? 1:將sheet中的所以列信息分別插入到Column表中,多少列就插入多少行記錄,這樣就能夠無限支持列數據的增加,而不會受到表字段數量的限制。
????? 2:將行信息,對excel左側對應的行號數據插入到Row中,有多少行就插入多少。
????? 3:最后是數據的存儲,主要是利用二維坐標定位邏輯來確定數據。

????? 4:盡管看起來一個sheet的數據分成三個表來存儲,但每個表存儲的內容都相當簡單,邏輯清晰,所以不會帶來更大的復雜性問題。

?

?????? 如何將數據庫中的數據加載到內存中,我這里構建一個對象,此對象代表excel中的一行數據,如果是sheet所有數據可以用List<SheetData>來表示。ColumnInfo中的Key就是列名稱,Value就是某一列的某一行的數據。按照我們的表結構,構建下面的對象模型也是比較容易的。

?

? public ?? class ?SheetData
????{
??????? public ?List<ColumnInfo>?Columns?{? get ;? set ;?}
????}
???? public ? class ?ColumnInfo
????{
???????? public ? string ??Key{ get ; set ;}
???????? public ? string ??Value{ get ; set ;}
????}

?

?????? 如何綁定Email模板,既然我們有了明確的對象結構,那么應用xsl語法就更加容易了:

??????

<table?style= " font-size:12; " >
??????????<tr>
????????????<xsl: for -each? select = " Email/SheetData/Columns/ColumnInfo " >
??????????????<td?style= " background-color:#FFFF00;width:85px; " >
????????????????<xsl:value-of? select = " Key " />
??????????????</td?>
????????????</xsl: for -each>
??????????</tr>
??????????<tr>
????????????<xsl: for -each? select = " Email/SheetData/Columns/ColumnInfo " >
??????????????<td>
????????????????<xsl:value-of? select = " Value " />
??????????????</td?>
????????????</xsl: for -each>
??????????</tr>
????????</table>


??????
????? 上面的方案解決了之前方案的所有問題,由于存儲數據的表結構是可知的,所以在數據庫查詢以及email模板的綁定上都不會有任何問題。

小項目之數據庫設計經驗分享


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久精品国产曰本波多野结衣 | 久久久久久久国产a∨ | 久久久高清国产999尤物 | 日本高清不卡二区 | 久久国产高清字幕中文 | 人人揉人人爽五月天视频 | 深夜福利免费 | 一级毛片视频播放 | 国产成人免费网站在线观看 | 加勒比一本大道在线 | 国产性一交一乱一伦一色一情 | 国产日韩久久久久69影院 | 国产精品国产三级国产普通话 | 国产一级淫片a免费播放口欧美 | 9re视频这里只有精品 | 国产香蕉75在线播放 | 亚洲精品国产成人 | 色综合久久综合欧美综合图片 | 国产精品国产三级国产 | 国内精品自在自线在免费 | 欧美嫩草| 在线看欧美三级中文经典 | 亚洲福利视频精选在线视频 | 亚洲产在线精品第一站不卡 | 国产欧美久久久精品 | 国产a免费| 欧美日韩在线成人免费视频大全 | 亚洲色四在线视频观看 | 亚洲在线一区 | 91手机视频在线 | 午夜视频精品 | 日本中文字幕有码 | 正在播放亚洲一区 | 久久国产乱子伦精品免费看 | 高h女| 欧美a色 | 欧美久 | 女人用粗大自熨喷水在线视频 | 日韩 欧美 亚洲国产 | 毛片毛片毛片毛片毛片毛片毛片 | 国产精品伦理一区二区三区 |