ORM是什么?

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í)一首歌可以屬于多張唱片。

了解到這就足夠用了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容