第六部分:SQL 和對象關(guān)系映射
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
在本書的這一部分中漫玄,我們將介紹一些內(nèi)容遗淳,它們與本書其余部分的結(jié)構(gòu)不相符,但對于初級開發(fā)人員來說救斑,這是非常必要的主題。了解如何在 SQL 數(shù)據(jù)庫中構(gòu)造數(shù)據(jù),會教給你如何在邏輯上思考數(shù)據(jù)存儲需求。有一個建立已久的方法來解構(gòu)數(shù)據(jù)旬蟋,有效存儲數(shù)據(jù)和訪問數(shù)據(jù)。近年來 NoSQL 數(shù)據(jù)庫的發(fā)展使其不同革娄,但關(guān)系數(shù)據(jù)庫設(shè)計背后的基本概念仍然有用倾贰。在你需要存儲數(shù)據(jù)的每個地方,都需要良好地構(gòu)造并理解數(shù)據(jù)拦惋。
大多數(shù)這些練習(xí)會讓你涉及使用 SQL 數(shù)據(jù)庫匆浙,因此,我建議你從 SQLite3 下載頁面下載sqlite3
二進(jìn)制文件厕妖,如果你還沒有安裝的話首尼。我們使用 Python,所以它已經(jīng)安裝在大多數(shù) Python 發(fā)行版中,但有時它不可用软能。如果你不能在你的 python shell 中運行這個 Python 代碼:
>>> import sqlite3
你的 Python 就沒有默認(rèn)帶有sqlite3
迎捺。你需要弄清楚為什么會丟失,并且很可能有另外一個包查排,你需要先安裝它才能在 Python 中使用凳枝。
理解 SQL 就是理解表
當(dāng)你開始這部分的練習(xí)之前,你需要完整理解一個概念雹嗦,它為許多 SQL 初學(xué)者造成了問題。
SQL 數(shù)據(jù)庫中的每個單獨的東西都是一張表合是。
把它刻錄到你的大腦里了罪。對于“表”,我是說就像一個電子表格聪全,其中左邊有行泊藕,頂部有列。通常难礼,你將使用進(jìn)入該列的某種數(shù)據(jù)來命名列娃圆。那么每一行代表你需要放入表的一件事情。這可以是一個帳戶蛾茉,一個人的名單及其信息讼呢,菜譜,甚至汽車谦炬。每一行都是一輛汽車悦屏,每列是一些屬性,關(guān)于你需要跟蹤的那輛車键思。
這為大多數(shù)程序員造成了問題础爬,因為我們按照樹形結(jié)構(gòu)思考問題。一個對象其中有另一個對象吼鳞,對象里面有個列表看蚜,列表里面有個字典,字典里面有個字符串赔桌,字符串映射為數(shù)據(jù)供炎。我們將東西嵌套在里面,而且這種風(fēng)格的數(shù)據(jù)結(jié)構(gòu)不適合表疾党。對于大多數(shù)程序員來說碱茁,似乎這兩個結(jié)構(gòu)(表和樹)不能共存,但是樹和表實際上是非常相似的仿贬。你幾乎可以使用任何樹形結(jié)構(gòu)纽竣,并將其映射到幾乎任何矩陣上,但你必須了解 SQL 數(shù)據(jù)庫的另一個方面:關(guān)系。
關(guān)系使得 SQL 數(shù)據(jù)庫變得比電子表格更有用蜓氨。電子表格可以讓你創(chuàng)建一整套工作表聋袋,并在其中放置不同類型的數(shù)據(jù),但是難以將這些工作表鏈接在一起穴吹。SQL 數(shù)據(jù)庫的目的完全是幽勒,使你可以使用列或其他表將表鏈接在一起。SQL 數(shù)據(jù)庫的天賦是港令,使用一個結(jié)構(gòu)(表)來構(gòu)建幾乎任何類型的數(shù)據(jù)結(jié)構(gòu)啥容,你可以通過將它們鏈接在一起來實現(xiàn)。
我們將了解SQL數(shù)據(jù)庫中的關(guān)系顷霹,但快速回答是咪惠,如果你可以創(chuàng)建一個數(shù)據(jù)樹,那么你可以將該樹放入1個或多個表中淋淀。在本書的這個階段遥昧,我們可以簡化將一組相關(guān)的Python類轉(zhuǎn)換為SQL表的過程,如下所示:
- 為所有類創(chuàng)建表朵纷。
- 在子表中設(shè)置
id
列指向父表炭臭。 - 在任何兩個類“之間”創(chuàng)建鏈接表,這兩個類通過列表鏈接袍辞。
它比這更復(fù)雜鞋仍,但是,當(dāng)將一組類轉(zhuǎn)換為 SQL 時搅吁,這是所做事情的要點凿试。事實上,大部分像 Django 這樣的系統(tǒng)似芝,是上述三件事情的復(fù)雜版本那婉。
你會學(xué)到什么
本節(jié)的目的不是教你如何成為一個 SQL 系統(tǒng)管理員。如果你想做這個工作党瓮,那么我建議你學(xué)習(xí)有關(guān) Unix 的一切详炬,然后去獲得一個公司的證書,這個公司提供技術(shù)認(rèn)證寞奸。請記住呛谜,這不是一個非常有趣的工作,類似于看管一個大型的貓類動物園枪萄。貓隐岛,不是小貓。
在第六部分末尾瓷翻,你將學(xué)到 SQL 在基本層面上的工作原理聚凹。這是一個 SQL 速成課割坠,以你創(chuàng)建的對象關(guān)系映射器(ORM)結(jié)束,它與 Django 相似妒牙。本節(jié)僅僅是了解 SQL 工作方式的一個突破點彼哼,目的是為你提供足夠的信息,來了解 Django 系統(tǒng)中發(fā)生的東西湘今。
如果你想在你的工作中超出這個部分敢朱,我推薦 Joe Celko 的《SQL For Smarties》,和一些時間摩瞎。Joe 的書很厚拴签,但很完整,他是 SQL 的大師旗们。閱讀這本書將使你非常能干蚓哩。