摘要:經過15天的夜以繼日的努力工作,一個複雜的資料庫計算型的軟體終于開始投入使用。在制作的工程中,筆者吸取了以前做軟體的經驗教訓,在這次的軟體設計與制作過程中把所學和所思的知識投入到實踐當中,并取得了良好的效果(MSSQL資料庫)。本系列将講述整個軟體的核心部分,不論是初學者還是程式設計高手,筆者認為在這一個系列中多多少少都能學到一些東西。
首先從業務的需求來說,筆者所作的軟體屬于直銷類的軟體。直銷是一種行業,在國外是合法的,在中國尚未在法律上規定為合法的。一提起直銷,大部分人會想到可惡的傳銷,早在98年的時候開始打擊傳銷,經過黨和國家的大力宣傳,把傳銷醜化的十分的可怕。筆者認為,傳銷有其合理的一面,傳銷中經常會有人被洗腦,就是一些牛人給你灌輸一些思想,讓你跟着他的意識走。而那些牛人常用的手段就是講授成功學,成功學教會人們如何更好的生存,成功學本身并沒有錯,錯就錯在那些牛人把成功學用在非法的斂财上了,這就在人麼内心目中導緻了成功學就是傳銷這樣一個歪曲的理念。傳銷顧名思義就是宣傳銷售,直銷是一種商業模式,銷售的對象是最終的消費者,而産品的來源就是其直接的生産商,這樣便減少了中間的商業過程,為最終的消費者提供實惠的消費品。商家便利用這層關系來推動市場來賺錢…跑題了,
接着說需求,直銷的制度有許多中,但是不變的就是返利計算,為最終的使用者傳回部分投資,這樣便能吸引更多的客戶來參與活動。這一次筆者所作的是一個隊列+矩陣,隊列就是排隊,先進先出的隊列,出來之後再進去,直到你進進出出共n此為止,每次出來都會得到一定的獎金,稱之為分紅。矩陣其實就是一個樹壯結構,3叉樹,二叉樹,每次添加一個葉子節點,上面的節點都會有相應的獎金,隊列+矩陣的這一部分隻占了總工作量的20%,系統中這一個需求基本上能滿足多個制度所需的功能。但是麻煩的是,系統中還有另外一個截然不同的制度需要攪和在一起,是以這就比較麻煩了。考慮到兩種制度一個系統的複雜性,在設計資料表之前先定義了資料類型和預設值,這樣在插入資料的時候這些預設值便可以起作用,并且如果在軟體正式使用之前發現資料類型定義不能滿足需求,比如原來是char(10)的現在需要修改為Char(20),隻需要修改類型的定義即可。資料表,視圖和存儲過程中可以使用自定義的資料類型,但是在函數的定義中不能使用自定義的資料類型,不知道為何。使用SQL腳本來定義資料庫,使得資料庫具有可重複性,在測試的時候比較友善。定義類型的SQL語句比較簡單,如下:
--------------------D_M_ID--------------
exec sp_addtype D_M_ID, 'VARCHAR(16)', 'NULL'
go
--------------------D_PASSWORD--------------
exec sp_addtype D_PASSWORD, 'VARCHAR(16)', 'NOT NULL'
--------------------D_NAME--------------
exec sp_addtype D_NAME, 'VARCHAR(16)', 'NULL'
--------------------D_REGDATE--------------
exec sp_addtype D_REGDATE, 'datetime', 'NULL'
--------------------D_ZIP--------------
exec sp_addtype D_ZIP, 'VARCHAR(12)', 'NULL'
--------------------D_SEX--------------
exec sp_addtype D_SEX, 'VARCHAR(4)', 'NULL'
--------------------D_ADDRESS--------------
exec sp_addtype D_ADDRESS, 'VARCHAR(100)', 'NULL'
--------------------D_IDCARD--------------
exec sp_addtype D_IDCARD, 'VARCHAR(38)', 'NULL'
--------------------D_BANKCARD--------------
exec sp_addtype D_BANKCARD, 'VARCHAR(38)', 'NULL'
--------------------D_PHONE--------------
exec sp_addtype D_PHONE, 'VARCHAR(30)', 'NULL'
--------------------D_EMAIL--------------
exec sp_addtype D_EMAIL, 'VARCHAR(50)', 'NULL'
--------------------D_TINY--------------
exec sp_addtype D_TINY, 'smallint', 'NULL'
--------------------D_BIRTHDAY--------------
exec sp_addtype D_BIRTHDAY, 'dateTime', 'NULL'
--------------------D_BIT--------------
exec sp_addtype D_BIT, 'bit', 'NULL'
--------------------D_int--------------
exec sp_addtype D_int, 'int', 'NULL'
這些定義的類型基本上能滿足大部分的需求,在資料由老系統進入新系統的過程中,曾經遭遇過字元串過長的問題,在此一定要提醒各位,資料類型的字元串或者資料大小範圍不妨設定的寬松一些,以備使用。定義了資料類型後,把他們放在一個單獨的檔案中,比如types.txt,使用ue進行編輯也比較友善,最好能寫注釋,這樣的話如果過了n天以後忘記了原來的設計思路,看到注釋還能夠回憶起來。在上面的設計中,可能有人會問為什麼zip的設計的字元長度為12,6個不就夠了嗎?問得好,本來郵政編碼都是六位,于是在WEB的控件輸入框中設定maxlength=6不就解決問題了嗎?這個回答貌似有道理,其實仔細想想,這是一方情願的事情,你不能控制客戶輸入的内容,如果他輸入6個漢字,也沒有超出輸入控件的設定範圍,又或者問,我使用JavaScript檢查,如果輸入漢字,就不讓送出。問得好,如果用戶端把javaScript屏蔽掉的話,照樣可以送出到伺服器端,導緻資料插入出錯,又或者問,我在伺服器端進行檢查,這樣問我就沒有辦法回答了,比如Struts,.net等很多軟體支援用戶端和伺服器端的雙重驗證,這樣雖然好,但是我覺得使用(Struts)那些軟體來快速的開發人機界面比較慢,如果有黑客繞過浏覽器,直接送出資料,那也沒有辦法。但是别忘了,殺雞不用牛刀,除非是有名的網站才值得黑客攻擊,大部分的網站被黑客攻擊的可能性很小,我不願意花費80%的精力來做20%的事情,是以幹脆就設計為這樣的。牢記二八原則,人生回過的比較寬松。
接下來的設計就是定義一些預設值,為什麼要定義預設值?有一些業務規則需要如果不填寫一些值他就需要一個預設值而不是空值,就是這麼簡單,典型的應用就是注冊的時候需要一個注冊的時間,取得系統的實踐作為注冊時間。為什麼不把預設值直接寫在建立表的SQL語句中,當然是可以的,但是,如果要修改預設值的話,每個相關的建立資料表的SQL語句都需要修改。插一句,為什麼要使用SQL腳本來建表,使用SQL腳本建表具有可重複性,可測試性等優點。強烈建議初學者一定要學會使用 SQL腳本。不多扯了,看看建立預設值的SQL語句:
---------------tiny default----------
create default [tiny_default] as 0
GO
exec sp_bindefault 'tiny_default', 'D_TINY'
---------------regDate default----------
create default [REGDATE_default] as getDate()
exec sp_bindefault 'REGDATE_default', 'D_REGDATE'
---------------------------------------
create default [bit_default] as 0
exec sp_bindefault 'bit_default', 'D_BIT'
create default [int_default] as 0
exec sp_bindefault 'int_default', 'D_INT'
預設值建立以後,需要綁定到列上或者自定義的資料類型上,把預設值的建立放在一個單獨的檔案中default.txt以友善修改。在本設計中沒有使用到check(限制),因為業務規則會變化,或者以後做另外的系統的時候業務規則變化,就比較麻煩,把設計放的寬松點讓生活更美好。
今天就先到這裡,明天接着講述資料表的設計,如果你能學到一些東西或者指出筆者的一些不足之處,筆者會十分高興。
本文轉自淩輝部落格51CTO部落格,原文連結http://blog.51cto.com/tianli/42011如需轉載請自行聯系原作者
lili00okok