1.數(shù)據(jù)庫與ORM的關(guān)系
- 數(shù)據(jù)庫:是存儲(chǔ)數(shù)據(jù)的地方,如MySQL、PostgreSQL等。它們使用SQL(結(jié)構(gòu)化查詢語言)來操作數(shù)據(jù)
- ORM(對(duì)象關(guān)系映射):是一種技術(shù),它允許你通過面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,而不是直接編寫SQL語句。ORM工具(如Sequelize、TypeORM)將數(shù)據(jù)庫表映射為編程語言中的類(或模型),使得你可以用更自然的方式處理數(shù)據(jù)。
- 學(xué)習(xí)基本的SQL:了解如何創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)等,這有助于更好地理解ORM的工作原理
- 選擇合適的ORM工具:根據(jù)你的項(xiàng)目需求和技術(shù)棧選擇一個(gè)合適的ORM工具,并深入學(xué)習(xí)其文檔
2.外鍵與關(guān)聯(lián)
- 外鍵含義:在設(shè)計(jì)數(shù)據(jù)庫時(shí),經(jīng)常會(huì)遇到需要表示實(shí)體之間關(guān)系的情況,這時(shí)就需要使用外鍵
- 創(chuàng)建外鍵:外鍵是數(shù)據(jù)表自帶的功能,可以通過圖形化界面創(chuàng)建,也可以通過SQL語句創(chuàng)建,也可以通過ORM進(jìn)行定義(內(nèi)部還是SQL)
- 定義模型之間的關(guān)系:在Sequelize中,可以使用hasOne, belongsTo, hasMany, belongsToMany等方法來描述這些關(guān)系,MySql本身沒有這種關(guān)聯(lián)關(guān)系,它通過SQL語句例如LEFT JOIN進(jìn)行關(guān)聯(lián)
3.外鍵約束
- 含義:當(dāng)你定義一個(gè)外鍵時(shí),可以指定四種不同的行為來控制 DELETE 和 UPDATE 操作
- CASCADE:級(jí)聯(lián)操作。如果父表中的記錄被更新或刪除,則相應(yīng)的子表中的記錄也會(huì)自動(dòng)更新或刪除。
- SET NULL:將子表中的外鍵字段設(shè)置為 NULL。僅當(dāng)外鍵字段允許 NULL 值時(shí)有效。
- NO ACTION 或 RESTRICT:拒絕執(zhí)行導(dǎo)致違反外鍵約束的操作。在 MySQL 中,這兩個(gè)選項(xiàng)的行為是相同的。
- SET DEFAULT:將子表中的外鍵字段設(shè)置為其默認(rèn)值。注意,并不是所有的存儲(chǔ)引擎都支持這個(gè)選項(xiàng)
4.ORM 框架
- 含義:ORM 是 "Object-Relational Mapping" 的縮寫,即對(duì)象關(guān)系映射,通俗的說,就是通過 ORM 讓開發(fā)中可以使用熟悉的編程語言語法來執(zhí)行常見的數(shù)據(jù)庫操作,代替原生的SQL
- sequelize 是一個(gè)基于 promise 的 Node.js ORM,他通過定義模型的形式(一個(gè)數(shù)據(jù)表對(duì)應(yīng)一個(gè)模型),來操作數(shù)據(jù)表
- 安裝
- 創(chuàng)建實(shí)例
- 通過實(shí)例定義模型(數(shù)據(jù)表結(jié)構(gòu))
- 同步模型
- 調(diào)用模型,進(jìn)行常用查詢的操作
5.一些注意點(diǎn)
- 樹形結(jié)構(gòu)的數(shù)據(jù),存在子節(jié)點(diǎn)時(shí),不得刪除,防止數(shù)據(jù)不一致,也不允許修改節(jié)點(diǎn)位置
- 父級(jí)角色取消勾選某些權(quán)限節(jié)點(diǎn)時(shí),子級(jí)角色相關(guān)的節(jié)點(diǎn)權(quán)限需要一并刪除
6.升級(jí)路線
| 階段 |
可以做的事 |
目標(biāo) |
| 初級(jí)版 |
最簡 CRUD + 基礎(chǔ)權(quán)限 |
能跑起來 |
| 中級(jí)版 |
封裝 service、攔截器、日志 |
更規(guī)范 |
| 高級(jí)版 |
多租戶支持、軟刪除恢復(fù)、數(shù)據(jù)歸檔 |
更健壯 |
| 企業(yè)級(jí) |
權(quán)限系統(tǒng)、審計(jì)日志、接口文檔自動(dòng)生成 |
可交付 |
7.ID 的選擇
- 如果系統(tǒng)是單體架構(gòu)、無分布式數(shù)據(jù)庫需求、對(duì) ID 可讀性要求高,自增 ID 是更優(yōu)解,性能更優(yōu),可讀性強(qiáng),實(shí)現(xiàn)簡單
- 如果系統(tǒng)涉及分布式部署(多數(shù)據(jù)庫節(jié)點(diǎn))、數(shù)據(jù)遷移 / 合并、需隱藏?cái)?shù)據(jù)量,可考慮 UUID,全局唯一,隱藏?cái)?shù)據(jù)規(guī)模,便于數(shù)據(jù)遷移(無需擔(dān)心 ID 重復(fù),避免繁瑣的 ID 重映射)
- 關(guān)于id命名:主鍵推薦直接用 id,因?yàn)?users 表里的 id 當(dāng)然就是 “user 的 id”,外鍵用 xx_id關(guān)聯(lián)即可
8.字段命名
- 推薦:數(shù)據(jù)庫列名用下劃線,代碼用駝峰法,通過ORM自動(dòng)完成轉(zhuǎn)換(包括讀取與寫入)
- Sequelize的配置方法:初始化實(shí)例時(shí),通過define.underscored進(jìn)行配置
const sequelize = new Sequelize('數(shù)據(jù)庫名', '用戶名', '密碼', {
host: 'localhost',
dialect: 'mysql',
// ?? 在這里統(tǒng)一配置,所有模型都生效
define: {
underscored: true, // 自動(dòng)把 camelCase 轉(zhuǎn)成 snake_case
}
});