設計你的資料庫系統(一)

by adonis 24. 七月 2017 11:10

作    者:楊先民
審    稿:張智凱

1    前言

最近剛好把之前在 iphone 開發的應用程式「油耗維修」整個用 Swift 3.0大改寫,趁著頭腦記憶力還清楚的時後,來記錄一下當時開發這個程式的設計規劃,因為它說穿了就是一個資料庫管理系統,很多開發人員總是不了解為什麼資料庫管理系效能會不好,要怎麼事後補救,其實這些都和事前的規劃有絕對的關係,而且本系列的文章是連同程式開發一起包進來,等於是程式設計加上資料庫的效能調教與系統分析的完整範例,讓想開發應用程式的人可以做一個參考。

2    關於這支程式

要介紹如何開發這支程式之前,先簡單介紹一下它的背景:
首先,它是我在2011年在 Apple Store上架的一隻程式,名稱叫做「油耗維修 Pro」,要價1美金,內容是記錄車主油耗以及維修的一些記錄資訊,以便車主日後可以看之前的加油資訊,以及進保養廠維修時,可以知道某個零件是否上次沒多久才換過,不用多花錢在一個零件還沒有壞掉也還沒過安全期前就把它換掉。

之前之使用 Object-C的程式撰寫,資料庫是使用 sqlite資料庫,而當時為了區分免費版與付費版,又多開發了一個 Free的版本,差別在於免費版只能記錄一輛車,但是付費版可以記錄 N 台車(N為任意數)。

這支程式其實是相當成功的一個作品,當年拿下下載總排39名以及分組第一的成績(好啦,當然是 Free版的,如果是 Pro版的,我早就發了)

image

image

但是,這個程式如果今年夏天再不改版的話,在 iOS 11的環境中,將無法使用(因為 iOS11將全面的停用 32bit的程式),而我打開原先寫的 Xcode專案時,又默默的把它關掉了…因為…已經有好一陣子沒寫 Object-C了,有點看不懂之外,編譯的時後竟然出現一堆 error,而且這些是我也不知道該怎麼改的。

所以我決定要把這支程式改寫成 Swift 3.0的程式,將程式功能全部移植過來,這也造就了今後一連串雜誌內容的主題。

當初在開發的時後,就是功能一點一點的增加,原先只是想單純的記錄一輛車的油耗資訊(也就是當初只想寫 Free版而以,因為想不到收費的利基點),後來想到一個人可能會有多台車,例如摩托車、汽車,這些都有可能會記錄油耗資訊,何不把收費功能寫在可以加第二台以上的車呢?於是 Pro版就這樣誕生了。

如果是現在的話,我可能會想辦法撰寫 「App內購買」的功能,因為畢竟讓你免費下載,大家用的開心,如果有第二台車要加,自然就比較能收到錢,而一開始的程式如果就要收費,評價到底好不好也是個問題,不然貿然下載。

簡單來說,如果當時有 App內購買這個機制的話,其實就是個免費版下載,需要進階功能再收費的機制。可惜現在要在改成這樣的機制為時以晚,因為當年的架構已經定了,要再改已經幾乎沒有辦法達成,因為 Pro版使用者已經賣了非常多套,要怎麼讓 Pro版可以套用到「App 購買」的機制,目前並沒有解決方案。

這些是專案開發時所面臨到的問題,當年定的架構事後要再推翻改變是非常困難的事情,所以系統分析一直是專案開發很重要的一環,不過本例是非戰之罪,因為當年沒有 App內購買的機制,之後才出來,日後要改成這樣的機制幾乎不可行,所以當年才會有一堆 Lite版和 Pro版的功能,近年來都幾乎是 App內購買的架構了。

所以其實本系統也是要探討這樣的開發問題,而類似的狀態會一直在本專案中出現,該如何克服或是化解也是本系列的主旨。
1    油耗維修程式概覽
很多人總覺得這個程式內容好像不多,有什麼好介紹?非也,當年我的同事也是看了個皮毛就說要用一個星期把我的程式用 Windows Phone改寫,但是當他了解細節之後,就改口說沒有辦法,功能有點多。

而我自己的經驗是,我用 Swift 3.0全新重寫這支程式,花了我一個月的時間,我早晚很努力的撰寫,回家也搞的半夜兩三點,才終於改寫完成,所以這也是開發專案時最容易出現的一個問題,就是:太輕忽程式的難易度,事實上這支程式設計起來,比各位想像的都還要複雜,還要難,可以利用這個程式練習好多的能力,尤其各位要知道 iPhone是有機型大小的,光版面的排版就是個問題了,所以本系列文章會有非常多集的原因在此。

先大致介紹有哪些功能,讓各位知道這個程式其實很大,不是一個普通的油耗程式,在各位開發專案時,在心裡就要先想定這個功能大概要怎麼做,用想像或是圖示的方式呈現,這樣事後做出來的結果就比較不會不同。

一:車主要填車籍資料:如果車主第一次使用系統,會檢查是否有填車主資料,沒有的話就無法跳到別的 Tab,本程式的開發是使用 Tab-based的方式開發,將功能分類成多個 Tab,未來也好拆程式給別人寫(如果有人要寫的話)。

車籍資料大概是長這樣:

image

在設計的時後,我是使用 iPhone SE的畫面來設計,因為 iPhone的畫面有 4吋、4.7吋與 5.5吋,所以要用 4吋來設計,避免最後顯示不下,至於 3.5吋就可以不管它了,因為沒有這個機型,而且 iOS 11全面不支援 32位元的程式。

按下「車籍資訊」可以隨時切換成預設想看的車子:

image

而車籍資料也可以隨時的刪除(除了第一台之外,這個之後說明,是有其歷史背景的),車籍若是要刪除,會順便把和它有關係的油耗、保修資料一併刪除。

程式的重點一在於,車主要替車子取暱稱以及幫它拍張照片,所以會有車子照片的功能:

image

一開始沒有圖片,就用我們的預設圖來代替,不然原本要放照片的地方看起來空空的感覺起來很奇怪,這些設定都是要事先想好的,因為牽涉到這個功能到底做不做的出來:

image

二 油耗資料:車主需要輸入油耗資料,並且可以看油耗明細,如下:

image

image

三.維修資料:車主需要能記錄自己在幾公里時換了什麼零件,買了什麼東西:

image

image

還要有日後搜尋的機制,方便找到某年某月曾經維修的資料。

image

四.統計圖表:本程式的重點之二,只是單純記油耗沒什麼,重點是要有統計圖,所以我們預想要提供綜合總計資料以及單項的統計資料,方便車主了解自己愛車的狀況。

image

image

image

更重要的來了,本程式能夠成為下載總排的關鍵在於,油耗自己記,自己看其實沒什麼,如果能和大家比較是最好的,所以本程式提供一個上傳的機制,將你的油耗上傳到網站,然後有個統計圖表來比較:

image

首先要先把自己的油耗上傳,然後就可以在統計圖表中看到統計資料:

image

而且因應資料庫有時結構會改變,所以在「設定」的地方,有提供一個資料庫重建的機制,避免應用程式因為找不到資料庫而發生閃退的情況。

image

而方便車主可以將資料備份出來,以免辛苦記錄的結晶消失,還提供了備份雲端的功能,之前備份雲端是備份在我本人的 DropBox帳號,不過現在則是希望備份到自己的 DropBox帳戶以方便管理。

image

嗯,先大致介紹這幾個功能,各位就可以發現它並不是一個一個星期就可以寫好的程式,其中包含的眉角實在太多,這也是為什麼我常在效能調的課程提到,效能好不好,在一開始的設計時就決定了,此言不虛啊,我們下期就從本程式的資料庫設計開始介紹。

3.結語

不知道各位在開發專案時,是否在心裡有像我上面的這一堆藍圖?我想要做什麼? 該如何呈現資料?這些都是專案開發的基本,在系統分析的課程告訴我們,事先把要呈現的資料用假資料帶出來吧!雖然我這些圖都是完工後的圖,但是都是我當時在開發時心中腦中所想到要呈現的結果,這些是給各位專案設計時的參考。

Tags:

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List