A. 銀行如何建設企業級資料庫基礎邏輯數據模型
前言:邏輯數據模型LDM是一種圖形化的展現方式,一般採用面向對象的設計方法,有效組織來源多樣的各種業務數據,使用統一的邏輯語言描述業務。藉助相對抽象、邏輯統一且結構穩健的結構,實現數據倉庫系統所要求的數據存儲目標,支持大量的分析應用,是實現業務智能的重要基礎,同時也是數據管理分析的工具和交流的有效手段。 需要強調的是,數據倉庫邏輯數據模型特指數據倉庫系統的核心基礎模型,在搭建企業級數據倉庫系統時,需要充分了解和分析種前台業務處理系統和應用,在此基礎上進行有效的重組和整合,為各種分析應用(如客戶關系管理、風險管理等)提供單一的、整合的數據基礎,保證全行不同業務部門從不同的視角都可以使用統一的數據實現各自的分析需求。——擔負這種數據重組和整合任務的數據模型稱為數據倉庫系統的「基礎邏輯數據模型」。 基礎邏輯數據模型建設好之後,銀行可根據不同的分析應用需要(如客戶關系管理、績效考核、風險管理等),根據應用產品和功能設計不同的分析應用模型,包含具體的、特定的分析邏輯,往往這種模型中都含有較多加工處理的成分。——這種為實現特定用途而設計的數據模型稱為數據倉庫系統的「應用數據模型」。 因此,不誇張地說核心基礎數據模型建設的成敗性會影響到整個數據倉庫系統的建設乃至後續各種分析應用,應引起銀行科技建設和業務分析人員的高度重視。 本文嘗試從銀行建設基礎邏輯數據模型的角度出發,分析、探討建設過程中應該考慮的主要因素、建設的方法以及注意的問題。 一、整體規劃、明確目標、合理定位 銀行建設數據倉庫系統時應充分明確建設目標,核心的邏輯數據模型是對銀行業務的高度抽象、能夠提供對關鍵業務數據的組織和整理,建立一套完整、統一、規范的標准,以便進行各類分析。一個好的核心基礎數據數據模型應該滿足以下條件: 概念上:具有高度抽象的、中性的、可共享的的概念,可有效、全面、完整地適應與涵蓋銀行現有的業務范疇以及數據范圍;不針對某個特別的應用而設計; 結構上:應是穩定的、靈活的、可擴展的;能以滿足第三範式的方法構建模型,存放最詳盡的數據,保證足夠的靈活性,適應復雜的實際業務情況,在業務發生變化或者新增數據源時易於擴展;核心結構在很長時間內應保持穩定性,便於回答不斷產生、不斷變化且無法預先定義的業務問題; 表現形式:應是規范的,易懂的;包括各類命名規范,業務規則定義,度量方式等。使用統一的業務語言進行模型設計,易於業務人員的理解和使用;也有利於IT部門和業務部門人員的溝通; 數據倉庫系統的建設目的和方法不同於傳統業務系統,其開發建設方式也有所不同,它的建設絕不是一蹴而就的事情,不能期望一朝一夕就可以全部完成,比較成熟的建設步驟應該是分階段實施,逐步進行完善和增強因此作為項目起步的LDM建設對於規范和推動整個數據倉庫系統的建設都將起到一個很好的促進。整個建設過程最關鍵的階段就是項目的最初階段,應將工作重心放在搭建模型框架、建立模型設計思想和培養模型設計人員三個方面。 明確了建設目標,具體實施應該如何開展呢? 二、審慎選擇、量體裁衣、度身定做 銀行在明確建設目標之後,如何選擇具體的實施策略、制定設計的階段和步驟呢?常見的主要有以下兩種: 第一種:自主研發:銀行根據以往的業務經驗提煉本行業務的關鍵主題;再設計出本行的概念模型;然後通過具體的業務反復論證,同時考慮將來的分析需求進行基礎邏輯數據模型的詳細設計。 這種方法可以快速啟動,完全依託本行的業務元素和規則,使用行內技術人員和業務人員比較熟悉的語言進行模型的設計,具有很好的適用性。但是整個建設周期比較長,同時往往由於經驗不足等原因給項目帶來一些不可控的風險,由於參與人員經驗的不足,不能夠站在全行的高度,從管理分析的角度去理解所有的業務以及相應的數據,造成一些局限性。 第二種:依託業成熟產品進行客戶化:銀行研究不同的業界模型產品,從中選擇一個作為藍本,結合本行的業務數據和應用系統進行具體的定製化。 這種方法的建設周期短、風險小,同時也能夠很好地借鑒成熟的邏輯數據模型中蘊涵的經營管理理念。但是銀行需要研究和比較多個業界流行的邏輯數據模型,熟悉各自的設計思想和理念,並從中挑選一個適合本行的模型產品進行客戶化。 從國際、國內商業銀行建設數據倉庫系統的經驗和案例來看,為了保證項目的成功實施,避免和控制項目風險,他們幾乎都選擇了第二種方法:客戶化。那銀行在面對眾多邏輯數據模型產品進行選擇的過程中主要應該都關注一些什麼樣的內容呢? 產品層面: 覆蓋范圍:模型產品應能夠適合、涵蓋銀行的所有業務范圍,可以在單一模型中能支撐金零售銀行、公司業務、保險、信用卡、經紀、證券和電子商務等,滿足未來混業經營的需要; 對業務發展的適應性:模型產品應有高度的概括和歸納,既滿足範式化要求,又具有足夠的靈活性,在擴展業務、新增品種或改變規則時,模型通過簡單的調整和擴展即可適應; 對應用的支撐和擴充:模型產品不應偏向某個部門或某些專業的特定應用,要能夠支持績效管理、客戶關系管理、資產負債管理、資金財務管理、風險管理等應用,並與國際金融業完全接軌,從數據介面層面支撐業界監管需要; 模型的開放性:模型產品應有清晰、嚴謹的模型架構,滿足模塊化和結構化的設計要求,真正實現數據一次導入,多次使用; 轉化成物理數據模型的方便性:LDM設計完成,進行一些物理化的定義之後就可以直接利用建模工具平滑地完成物理模型設計。 服務層面: 客戶化方法與能力:邏輯數據模型必須有經過實際項目驗證過的客戶化方法論做指導,明確嚴格的工作步驟、流程、任務分配,並提供必要模板; 業績經驗與表現:應具有國際化大型(特別是國內)商業銀行相關項目和領域的成功實施案例;在行業內具有良好的信譽和業績; 全球支持能力:全球專職研發團隊——各國家地區的具體實施團隊;高級建模顧問——高級金融行業顧問; 不難看出,上述這些考核的方面都是和將來的實施密切相關的。的確,一個成熟的優秀的模型產品,如果沒有得到成功的實施,最終也不能為銀行創造效益。下一部分主要討論在實施過程中的關鍵因素。 三、關鍵成功因素 (1)參與人員的業務經驗 LDM的設計和實施不是一個純粹的技術問題,需要參與人員具有較高的銀行業務修養和素質,設計人員應能夠憑借豐富的業務經驗和知識,將散落在各種不同業務系統以及日常經營管理中的各種數據元素進行高度的抽象和概況,形成本行的幾個主題域(如當事人、協議、產品、事件等),用以清晰地表達業務邏輯和關系。同時,他們也必須時刻以目標(建設數據倉庫系統)為導向,有選擇地從前台業務系統中抽取相關的數據信息進行映射。 (2)設計團隊的溝通機制 邏輯數據模型的設計過程本身就是一個不斷發現問題、解決問題的過程,不可能某一個人就能夠掌握龐雜銀行業務中的點點滴滴,因此需要整個項目團隊的密切配合。每個設計人員都必應具有良好的學習溝通能力,能夠對建模工作達成共識,根據所定義的結構,將具體的業務數據映射到模型中,同時進行一些修改和校正。 (3)銀行內部IT管理的水平 LDM設計過程中很大量的工作都是對現有業務系統的分析,包括對系統架構和功能的梳理、業務規則和關鍵業務元素的提煉、系統之間的邏輯關系等,並結合樣本數據初步了解數據質量。如果沒有一套有效的管理模式和有力的技術支持,如果沒有現有業務系統的完備資料;如果沒有快速問題反饋和解決機制,LDM的建設只能是空談,因此這給銀行內部IT管理水平提出了很高的要求。 (4)模型的管理和維護 在LDM整個建設周期內還應高度重視維護和管理工作,必需有嚴格的建模技術規范做指導和約束,包括命名、描述、版本控制等。隨著時間的推移和項目建設階段和目標的變化,為了使建成的基礎數據模型具有持續的生命力,應在建設的所有階段把涉及的建模規范內容文檔化並強制執行;在人員發生變動時規定新參與人員應嚴格遵守這些規范,不能另行編制,保證前後的一致性。 總結: 盡管LDM僅僅是一個邏輯的概念,數據倉庫系統需要在邏輯數據模型的指導下,進行真正的物理實施,將把分散在不同平台、以不同方式組織的各種業務數據以及部分外部信息經過清洗和轉化,在保證數據一致性、准確性和實效性的前提下,開發各種應用,奠定實現銀行商業智能的重要基礎。 但是可以看到,通過數據倉庫系統邏輯數據模型的設計,將有利於對銀行現有業務過程的全局認識和系統把握,同時還能夠從整體上對全行使用的操作型業務系統進行回顧,從而提供改造和完善的建議,最終探索出一條符合銀行自身業務實際發展要求的分析型應用系統的道路,為數據倉庫系統的建設奠定堅實的基礎。
B. 求幫忙做一個銀行資料庫 Oracle
功能一:
create database bank;
功能二:
create table userinfo(
customerID number(10) not null,
customerName varchar2(10) not null,
PID char(18) not null,
telephone char(11) not null,
address varchar2(255) not null
);
create table cardinfo(
cardID varchar2(19) not null,
cardCustomerID number(10) not null,
curtype char(3) not null,
savingtype char(4) not null,
openDate date not null,
openmoney number(10,2) not null,
blance number(10,2) not null,
password char(6) not null,
isreportLoss char(2) not null
);
create table transinfo(
id number(15) not null,
transcustomerID number(10) not null,
transcardID varchar2(19) not null,
transdate date not null,
transmoney number(10,2) not null,
transtype char(4) not null,
remark varchar2(255) not null
);
功能三:
alter table userinfo add constraint pk_userinfo primary key (customerID);
alter table userinfo add constraint ck_PID check(length(PID)=18);
alter table cardinfo add constraint pk_cardinfo primary key (cardID);
alter table cardinfo add constraint fk_CustomerID_card foreign key cardCustomerID references userinfo(customerID);
alter table transinfo add constraint pk_transinfo primary key (id);
alter table transinfo add constraint fk_CustomerID_trans foreign key cardCustomerID references userinfo(customerID);
alter table transinfo add constraint fk_transcardID_trans foreign key cardCustomerID references cardinfo(cardID);
功能四:
insert into userinfo values(1,'張三','123456789012345671','13012345671','地址1');
insert into userinfo values(2,'李四','123456789012345672','13012345672','地址2');
insert into userinfo values(3,'王五','123456789012345673','13012345673','地址3');
insert into cardinfo values('1234567890123456789',1,'RMB','活期',sysdate,5.04,5.04,'123456','否');
insert into cardinfo values('1234567890123456788',2,'JPY','活期',sysdate,3.22,3.22,'123457','否');
insert into cardinfo values('1234567890123456787',3,'USA','定期',sysdate,6.78,6.78,'123458','否');
insert into transinfo values(1,1,'1234567890123456789',sysdate,0.23,'存入','存錢');
insert into transinfo values(2,2,'1234567890123456788',sysdate,1.27,'支取','取錢');
insert into transinfo values(3,3,'1234567890123456787',sysdate,2.34,'存入','存錢');
功能五:
select transcardID,transmoney from transinfo where to_char(transdate,'mm')=to_char(sysdate,'mm') and transmoney=max(transmoney);
功能六:
create procere p_c
is
cursor cr is
select b.cardID,a.customerName,a.telephone from userinfo a,cardinfo b where a.customerID=b.cardCustomerID and to_char(sysdate,'dd') in ('28','29','30','31') and b.blance<200;
cur_info cr;
begin
for cur_info in cr loop
dbms_output.put_line('卡號:' || cur_info.cardID || '&&' || '姓名:' || cur_info.customerName || '電話:' || cur_info.telephone);
end loop;
end p_c;
C. 大型資料庫的設計原則與開發技巧
隨著計算機技術越來越廣泛地應用於國民經濟的各個領域 在計算機硬體不斷微型化的同時 應用系統向著復雜化 大型化的方向發展 資料庫是整個系統的核心 它的設計直接關系系統執行的效率和系統的穩定性 因此在軟體系統開發中 資料庫設計應遵循必要的資料庫範式理論 以減少冗餘 保證數據的完整性與正確性 只有在合適的資料庫產品上設計出合理的資料庫模型 才能降低整個系統的編程和維護難度 提高系統的實際運行效率 雖然對於小項目或中等規模的項目開發人員可以很容易地利用範式理論設計出一套符合要求的資料庫 但對於一個包含大型資料庫的軟體項目 就必須有一套完整的設計原則與技巧
一 成立數據小組
大型資料庫數據元素多 在設計上有必要成立專門的數據小組 由於資料庫設計者不一定是使用者 對系統設計中的數據元素不可能考慮周全 資料庫設計出來後 往往難以找到所需的庫表 因此數據小組最好由熟悉業務的項目骨幹組成
數據小組的職能並非是設計資料庫 而是通過需求分析 在參考其他相似系統的基礎上 提取系統的基本數據元素 擔負對資料庫的審核 審核內容包括審核新的資料庫元素是否完全 能否實現全部業務需求 對舊資料庫(如果存在舊系統)的分析及數據轉換 資料庫設計的審核 控制及必要調整
二 設計原則
規范命名 所有的庫名 表名 域名必須遵循統一的命名規則 並進行必要說明 以方便設計 維護 查詢
控制欄位的引用 在設計時 可以選擇適當的資料庫設計管理工具 以方便開發人員的分布式設計和數據小組的集中審核管理 採用統一的命名規則 如果設計的欄位已經存在 可直接引用 否則 應重新設計
庫表重復控制 在設計過程中 如果發現大部分欄位都已存在 開發人員應懷疑所設計的庫表是否已存在 通過對欄位所在庫表及相應設計人員的查詢 可以確認庫表是否確實重復
並發控制 設計中應進行並發控制 即對於同一個庫表 在同一時間只有一個人有控制權 其他人只能進行查詢
必要的討論 資料庫設計完成後 數據小組應與相關人員進行討論 通過討論來熟悉資料庫 從而對設計中存在的問題進行控制或從中獲取資料庫設計的必要信息
數據小組的審核 庫表的定版 修改最終都要通過數據小組的審核 以保證符合必要的要求
頭文件處理 每次數據修改後 數據小組要對相應的頭文件進行修改(可由管理軟體自動完成) 並通知相關的開發人員 以便進行相應的程序修改
三 設計技巧
分類拆分數據量大的表 對於經常使用的表(如某些參數表或代碼對照表) 由於其使用頻率很高 要盡量減少表中的記錄數量 例如 銀行的戶主賬表原來設計成一張表 雖然可以方便程序的設計與維護 但經過分析發現 由於數據量太大 會影響數據的迅速定位 如果將戶主賬表分別設計為活期戶主賬 定期戶主賬及對公戶主賬等 則可以大大提高查詢效率
索引設計 對於大的資料庫表 合理的索引能夠提高整個資料庫的操作效率 在索引設計中 索引欄位應挑選重復值較少的欄位 在對建有復合索引的欄位進行檢索時 應注意按照復合索引欄位建立的順序進行 例如 如果對一個 萬多條記錄的流水表以日期和流水號為序建立復合索引 由於在該表中日期的重復值接近整個表的記錄數 用流水號進行查詢所用的時間接近 秒 而如果以流水號為索引欄位建立索引進行相同的查詢 所用時間不到 秒 因此在大型資料庫設計中 只有進行合理的索引欄位選擇 才能有效提高整個資料庫的操作效率
數據操作的優化 在大型資料庫中 如何提高數據操作效率值得關注 例如 每在資料庫流水表中增加一筆業務 就必須從流水控製表中取出流水號 並將其流水號的數值加一 正常情況下 單筆操作的反應速度尚屬正常 但當用它進行批量業務處理時 速度會明顯減慢 經過分析發現 每次對流水控製表中的流水號數值加一時都要鎖定該表 而該表卻是整個系統操作的核心 有可能在操作時被其他進程鎖定 因而使整個事務操作速度變慢 對這一問題的解決的辦法是 根據批量業務的總筆數批量申請流水號 並對流水控製表進行一次更新 即可提高批量業務處理的速度 另一個例子是對插表的優化 對於大批量的業務處理 如果在插入資料庫表時用普通的Insert語句 速度會很慢 其原因在於 每次插表都要進行一次I/O操作 花費較長的時間 改進後 可以用Put語句等緩沖區形式等滿頁後再進行I/O操作 從而提高效率 對大的資料庫表進行刪除時 一般會直接用Delete語句 這個語句雖然可以進行小表操作 但對大表卻會因帶來大事務而導致刪除速度很慢甚至失敗 解決的方法是去掉事務 但更有效的辦法是先進行Drop操作再進行重建
資料庫參數的調整 資料庫參數的調整是一個經驗不斷積累的過程 應由有經驗的系統管理員完成 以Informix資料庫為例 記錄鎖的數目太少會造成鎖表的失敗 邏輯日誌的文件數目太少會造成插入大表失敗等 這些問題都應根據實際情況進行必要的調整
必要的工具 在整個資料庫的開發與設計過程中 可以先開發一些小的應用工具 如自動生成庫表的頭文件 插入數據的初始化 數據插入的函數封裝 錯誤跟蹤或自動顯示等 以此提高資料庫的設計與開發效率
避免長事務 對單個大表的刪除或插入操作會帶來大事務 解決的辦法是對參數進行調整 也可以在插入時對文件進行分割 對於一個由一系列小事務順序操作共同構成的長事務(如銀行交易系統的日終交易) 可以由一系列操作完成整個事務 但其缺點是有可能因整個事務太大而使不能完成 或者 由於偶然的意外而使事務重做所需的時間太長 較好的解決方法是 把整個事務分解成幾個較小的事務 再由應用程序控制整個系統的流程 這樣 如果其中某個事務不成功 則只需重做該事務 因而既可節約時間 又可避免長事務
適當超前 計算機技術發展日新月異 資料庫的設計必須具有一定前瞻性 不但要滿足當前的應用要求 還要考慮未來的業務發展 同時必須有利於擴展或增加應用系統的處理功能
lishixin/Article/program/SQL/201311/16498