標籤:rdb type ase 還需 表示 ica des 記錄 cat
NoSQL 這個詞在近些年正變得隨處可見. 但是到底 “NoSQL” 指的是什麼? 它是如何並且為什麼這麼有用? 在本文, 我們將會通過純 Python (我比較喜歡叫它, “輕結構化的虛擬碼”) 寫一個 NoSQL 資料庫來回答這些問題.
OldSQL
很多情況下, SQL 已經成為 “資料庫” (database) 的一個同義字. 實際上, SQL 是 Strctured Query Language 的首字母縮寫, 而並非指資料庫技術本身. 更確切地說, 它所指的是從 RDBMS (關係型資料庫管理系統, Relational Database Management System ) 中檢索資料的一門語言. mysql, MS SQL Server 和 Oracle 都屬於 RDBMS 的其中一員.
RDBMS 中的 R, 即 “Relational” (有關係,關聯的), 是其中內容最豐富的部分. 資料通過 表 (table) 進行組織, 每張表都是一些由 類型 (type) 相關聯的 列 (column) 構成. 所有表, 列及其類的類型被稱為資料庫的 schema (架構或模式). schema 通過每張表的描述資訊完整刻畫了資料庫的結構. 比如, 一張叫做 Car 的表可能有以下一些列:
Make: a string
Model: a string
Year: a four-digit number; alternatively, a date
Color: a string
VIN(Vehicle Identification Number): a string
在一張表中, 每個單一的條目叫做一 行 (row), 或者一條 記錄 (record). 為了區分每條記錄, 通常會定義一個 主鍵 (primary key). 表中的 主鍵 是其中一列 , 它能夠唯一標識每一行. 在表 Car 中, VIN 是一個天然的主鍵選擇, 因為它能夠保證每輛車具有唯一的標識. 兩個不同的行可能會在 Make, Model, Year 和 Color 列上有相同的值, 但是對於不同的車而言, 肯定會有不同的 VIN. 反之, 只要兩行擁有同一個 VIN, 我們不必去檢查其他列就可以認為這兩行指的的就是同一輛車.
Querying
SQL 能夠讓我們通過對資料庫進行 query (查詢) 來擷取有用的資訊. 查詢 簡單來說, 查詢就是用一個結構化語言向 RDBMS 提問, 並將其返回的行解釋為問題的答案. 假設資料庫表示了美國所有的註冊車輛, 為了擷取 所有的 記錄, 我們可以通過在資料庫上進行如下的 SQL 查詢 :
SELECT Make, Model FROM Car;
將 SQL 大致翻譯成中文:
“SELECT”: “向我展示”
“Make, Model”: “Make 和 Model 的值”
“FROM Car”: “對錶 Car 中的每一行”
也就是, “向我展示表 Car 每一行中 Make 和 Model 的值”. 執行查詢後, 我們將會得到一些查詢的結果, 其中每個都是 Make 和 Model. 如果我們僅關心在 1994 年註冊的車的顏色, 那麼可以:
SELECT Color FROM Car WHERE Year = 1994;
此時, 我們會得到一個類似如下的列表:
Black
Red
Red
White
Blue
Black
White
Yellow
最後, 我們可以通過使用表的 (primary key) 主鍵 , 這裡就是 VIN 來指定查詢一輛車:
SELECT * FROM Car WHERE VIN = ‘2134AFGER245267‘
上面這條查詢語句會返回所指定車輛的屬性資訊.
主鍵被定義為唯一不可重複的. 也就是說, 帶有某一指定 VIN 的車輛在表中至多隻能出現一次. 這一點非常重要,為什麼? 來看一個例子:
Relations
假設我們正在經營一個汽車修理的業務. 除了其他一些必要的事情, 我們還需要追蹤一輛車的服務曆史, 即在該輛車上所有的修整記錄. 那麼我們可能會建立包含以下一些列的 ServiceHistory 表:
VIN | Make | Model | Year | Color | Service Performed | Mechanic | Price | Date
用 Python 寫一個 NoSQL 資料庫Python