11 8月 2012

[備忘] 在 Linux 裡設定 PostgreSQL 和 Django



2009 年時,因為準備創業的關係,我開始接觸「關連資料庫」這個東西的觀念。我只能說「接觸」和「觀念」,因為之前只有在讀研究所時,為了架設研討會網站而被迫在四天之內,把 MySQL 從無到有地學會怎麼操作。甚至,說「操作」也實在是太抬舉自己了。我只能用固定的幾個指令複製加貼上地撈出資料而已。那些指令是什麼意思,資料庫裡面又是什麼結構,我完全不知道。

我超~級~討~厭~知其然,不知其所以然的事情。就像前陣子在查如何 DIY 抗生素的時候,很驚訝(還帶著一點怒氣)地發現,怎麼絕大部份的中文網站都只寫著「以往青黴素是由青黴菌提煉而成…」而沒有說明到底提煉的步驟是什麼呢?

難道我只要拿著一片長出青黴的土司丟出去,然後大喊「青黴素,就決定是你了!」然後青黴素就會在一陣光芒中跳出來,還低吼著「青黴~青黴~」嗎? 青黴素固然很神奇,但是畢竟不是神奇寶貝吧?難道,抗生素、奎寧…等等重要的衛生技術不該列入國民義務教育裡面嗎?

於是,為了讓自己不再只是 know what 和 know how 的程度,而更能進入 know why 的領域,也為了能搞清楚到底什麼是 SQL 關聯資料庫,讓不同項目產生「關聯」的目的是什麼?我把「搞清楚 SQL」排入了我的工作項目表中,但在眾多的 SQL 選擇中,我又該投入哪一個陣營呢?

在回答這些問題前,我先做了一番初步的調查。

Microsoft SQL Server: 老實說,我對 M$ 沒什麼特別的意見。(真的,我真的沒意見。但是我每次說這句話,都沒人相信!) 我就只是單純地「不喜歡 M$ 出品的軟體而已。」再加上…MS SQL Server 不但價錢不低,還只能裝在 MS Windows 的系統裡。

ps. Microsoft 的軌跡球真是超讚,我十一年前買的一直用到現在呢!如果可以的話,我建議 Microsoft 不要再做軟體了,以後專心做軌跡球就好了。

MySQL: 因為之前接觸那一點點皮毛的 SQL 就是 MySQL,所以本來就要選擇以海豚為 Logo 的 MySQL 陣營了,想不到,2009 年時 Oracle 把 SUN 買下來以後,就宣佈以後 MySQL 要丟給社群去維護了。為了避免學了一個技術,卻在將來的某一天會因為法律問題而無法使用這個技術的風險,我只好把眼光別開,看看其他的選擇。

MariaDB: 由 MySQL 的原作者依不同授權分支出來的專案。目的在於維持和 MySQL 版本和功能的平行一致,但又能擁有更自由的授權方式。因為當時這個專案才剛開始,所以教學文件不多,常常都要參考 MySQL 的各種文件和 blog 技術分享文。但當時又菜又弱的我根本就搞不懂自訂變數和內建指令的差別。搞了兩星期後,最後只好放棄。我還記得當時看著這個 Logo 是一隻海狗的資料庫心想「又是海豚又是海狗的,怎麼搞資料庫的都喜歡海生哺乳動物啊?」

SQLite: 輕便好上手的 SQLite 連 Python 都有內建。但把玩了一陣子以後,才發現這個東西好像比較適合拿來當做單機版程式的資料庫,而不適合用來做網路服務背後的資料庫。

之後因為工作忙碌,我只好暫時把學關聯資料庫的念頭放下,專心做好手邊的案子。在這段期間裡,應交大外文系辦的要求,用 Excel 檔的表格當做資料庫的表格寫了一個財產設備管理系統給系上使用。寫著寫著,我突然想通了很多本來看不懂的專有名詞是什麼意思。原來,所謂「資料庫」的意思,應該是在一個「伺服器系統」裡有一個「資料庫伺服器」,而這個「資料伺服器」裡,可以有很多個「資料庫」;在同一個資料庫裡面,又可以有很多個「表格」,且不同表格之間裡面的條目,很多時候是可以互通的。

比方說在財產設備管理系統裡,一個系所可能管理 A、B、C 三部印表機,而這三部印表機又分別屬於甲、乙、丙三位教授。如果我今天要列出系上所有的印表機的話,就會長得像:

A: 甲
B: 乙
C: 丙

但同時,甲教授手上可能也有很多其他的設備,所以當我要列出甲教授手上所有的設備時,就會像:

A:甲
Z:甲
K:甲
H:甲

這個樣子。如果今天甲教授手上的 A 印表機要報廢了,那麼只要我在甲教授財產清單裡將 A 印表機標記為「報廢」的時候,系所總財產清單裡的 A:甲 這一項,也要連帶地被標記為「報廢」。也就是說,如果我用 Excel 當做資料庫的話,上述的「標記為報廢」的動作,我要做兩次,如果今天有一個系統能辨識出甲教授財產清單裡的 A 印表機和系所總財產清單裡的 A 印表機是同一個東西的話,我就只要做一次「標記為報廢」的動作了。

這…這就是「關聯資料庫」裡「關聯」的意思吧?所以,只要把資料庫表格裡的某個欄位設為「主鍵」,其他所有和這個主鍵有關聯的東西,就會一起聯動了。(原來這就是「主鍵」的意思啊。我之前看了半天,也想不透什麼叫「主鍵」。甚至,有的文章裡,把它叫「金鑰」…我還以為這和什麼加密的功能有關咧!)

帶著這樣的領悟,再重新去摸索 SQL 的世界。最後我選擇了 PostgreSQL 搭配 Python 的Django 在我的 Linux 主機上配置出一個我看得懂的資料庫。至於最後為什麼選擇 PostgreSQL 呢?嗯…我覺得它 Logo 裡的那隻大象肥肥的很可愛。(慚愧…這是哪門子的不理性決定啊!)

於是,就這樣用 PostgreSQL 配 Django 用了近三年,最近這次趁著把資料庫伺服器移植到新的 HP G6 裡時,留下這張超大的設定說明圖吧!:)


0 意見:

張貼留言