ORM 出自 阮一峰博客
它是什么
字面意思
實(shí)際上就是個(gè)縮寫,表示對(duì)象-關(guān)系映射的縮寫
- O->Object
- RM->Relational (關(guān)系) Mapping(映射)
代表什么思想
實(shí)際上就是一種把數(shù)據(jù)庫映射成對(duì)象的想法
- 數(shù)據(jù)庫的表(table) --> 類(class)
- 記錄(record,行數(shù)據(jù))--> 對(duì)象(object)
- 字段(field)--> 對(duì)象的屬性(attribute)
比如說查詢語句 SELECT id, first_name, last_name, phone, birth_date, sex FROM persons WHERE id = 10
對(duì)應(yīng)到代碼就是
res = db.執(zhí)行數(shù)據(jù)庫(sql);
name = res[0]["FIRST_NAME"];
那么ORM的寫法就是
p = Person.get(10);
name = p.first_name;
這樣的好處就是可以不需要了解數(shù)據(jù)庫底層,因?yàn)樗恍枰佑|SQL語句
所以ORM有這樣一些優(yōu)點(diǎn)
-
ORM生態(tài)已經(jīng)比較完備,有很多的工具支持 - 天生的
MVC,ORM就是天生的Model - 可以不寫
SQL了。
它的缺點(diǎn)來說:
- 復(fù)雜查詢很難做到,做到了性能也很差
- 學(xué)習(xí)成本比較高
- 由于不需要接觸
SQL所以無法定制一些特殊的SQL
命名規(guī)范
目前公認(rèn)最規(guī)范的是Ruby 語言的 Active Record。Active Record 對(duì)于對(duì)象和數(shù)據(jù)庫表的映射,有一些命名限制。
(1)一個(gè)類對(duì)應(yīng)一張表。類名是單數(shù),且首字母大寫;表名是復(fù)數(shù),且全部是小寫。比如,表 books 對(duì)應(yīng)類 Book。
(2)如果名字是不規(guī)則復(fù)數(shù),則類名依照英語習(xí)慣命名,比如,表 mice 對(duì)應(yīng)類 Mouse,表 people 對(duì)應(yīng)類 Person。
(3)如果名字包含多個(gè)單詞,那么類名使用首字母全部大寫的駱駝拼寫法,而表名使用下劃線分隔的小寫單詞。比如,表 book_clubs 對(duì)應(yīng)類 BookClub,表 line_items 對(duì)應(yīng)類 LineItem。
(4)每個(gè)表都必須有一個(gè)主鍵字段,通常是叫做 id 的整數(shù)字段。外鍵字段名約定為單數(shù)的表名 + 下劃線 + id,比如 item_id 表示該字段對(duì)應(yīng) items 表的 id 字段。
示例庫 OpenRecord
OpenRecord 是仿 Active Record 的,將其移植到了 JavaScript,而且實(shí)現(xiàn)得很輕量級(jí),學(xué)習(xí)成本較低。我寫了一個(gè)示例庫,請(qǐng)將它克隆到本地。
連接數(shù)據(jù)庫
使用 ORM 的第一步,就是你必須告訴它,怎么連接數(shù)據(jù)庫(完整代碼看這里)。
// demo01.js const Store = require('openrecord/store/sqlite3'); const store = new Store({ type: 'sqlite3', file: './db/sample.db', autoLoad: true, }); await store.connect();
連接成功以后,就可以操作數(shù)據(jù)庫了。
Model
沒啥好說的,就是ORM的框架會(huì)把表轉(zhuǎn)成類對(duì)象
CRUD 操作
也沒什么好說的,增刪改查都從查詢語句變成了調(diào)用方法
關(guān)系
表與表之間的關(guān)系(relation),分成三種。
- 一對(duì)一(one-to-one):一種對(duì)象與另一種對(duì)象是一一對(duì)應(yīng)關(guān)系,比如一個(gè)學(xué)生只能在一個(gè)班級(jí)。
- 一對(duì)多(one-to-many): 一種對(duì)象可以屬于另一種對(duì)象的多個(gè)實(shí)例,比如一張唱片包含多首歌。
- 多對(duì)多(many-to-many):兩種對(duì)象彼此都是 "一對(duì)多" 關(guān)系,比如一張唱片包含多首歌,同時(shí)一首歌可以屬于多張唱片。
了解到這就足夠用了