跳至主要内容

[DB] 資料庫基礎 Database Basic

資料庫是什麼

資料庫的使用主要包含了三個部分「資料庫本身」、「DBMS」和「程式部分」:

  • DBMS:全名是 database management system,它是用來操作資料庫的軟體,也就是實際將資料庫中的資料進行新增、刪除、修改、更新的部分。另外,一般在說使用的是資料庫是 MySQL,或使用的資料庫是 PostgreSQL 時,實際上也是只 DBMS 的部分,而多數的 DBMS 都可以理解 SQL 的指令。
  • 程式:程式部分指的是使用者輸入資料,以及檢視資料的地方,以 Web 來說,通常包含整個前後端,使用者於前端輸入資料,前端將資料傳送到後端後,後端程式再透過 DBMS 的指令將資料保存在資料庫中,而前後端就是這裡所指的程式部分。

資料庫的分類

資料庫主要可以分成兩類,關聯式資料庫(relational database)和非關聯式資料庫(NoSQL):

  • 關聯式資料庫:常見開源免費的包含 MySQL 和 PostgreSQL;而付費的像是 Microsoft SQL Server 和 Oracle Database。
  • 非關聯式資料庫:常見以 Key-Value Store(KVS)方式儲存的是 Redis 或 Amazon DynamoDB;文件方式儲存的是 MongoDB 和 CouchDB;另外還有像是多節點連結的 Neo4j。

資料庫也可以另外分成「伺服器型資料庫」和「檔案型資料庫」:

  • 伺服器型資料庫:幾乎所有 RDBMS 都是伺服器型資料庫,這種類型的資料庫需要先將資料庫安裝於電腦主機上才能使用。
  • 檔案型資料庫:一個檔案本身就是一個資料庫,像是 SQLite 或 Microsoft Access 都是這種類型的資料庫,適合用在資料量較少,且不會有多人同時存取的情況。

使用資料庫的好處

使用資料庫有一個很重要的好處是讓「程式」和「資料庫」解耦,也就是說,未來如果想要更換不同的資料庫,可以讓程式不用大幅調整的情況下,進行資料庫的更換。

資料表的設計

30-14 之資料庫層的優化 - 表的設計 @ mark-lin

字串

  • 欄位中的字串長度會變動的話: varchar
  • 欄位中的字串長度固定且可能經常更新:char

數值

  • 不需要負數時,使用 unsigned 可以有兩倍大的儲存空間
  • 選擇合適的儲存大小,能用 int 就不需要使用 bigint
  • 金額使用 decimal

主鍵(Primary Key)

  • 不要使用太長的值(例如,uuid)當作 PK,會影響到性能。

其他

  • 儘量不要允許 null,效能會更好,且在 count 時不會有不同的結果
  • 建議在表中加入註解

資料表正規化

30-17 之 MongoDB 的設計---正規與反正規化的戰爭 @ mark-lin

  • 第一正規形式:欄位中不要有重複群組(像是陣列的東西)
  • 第二正規形式:去除相依性(拆成多個關聯的表)
  • 第三正規形式:刪除不依賴索引鍵的欄位(可以透過其他欄位計算得出的值不儲存)

交易(transaction)的特性:ACID

  • Atomicity(原子性):只會是全部執行或全部尚未執行的其中一種狀態
  • Consistency(ㄧ致性):交易前後資料的完整性受到保持,例如透過定義 Model Schema
  • Isolation(隔離性):交易執行時,其他使用者看不到正在處理的資料,也不會受到影響
  • Durability(持久性):交易完成後將永久被儲存

鎖定與死結(lock &deadlock)

  • 共享鎖(讀鎖):自己正在讀取,限制他人無法寫入
  • 排他鎖(寫鎖):自己正在寫入,限制其他人無法讀取(因為值可能還會改變)和寫入

資訊安全的三原則:CIA

  • Confidentiality(機密性):只有擁有正當權利的人才能存取
  • Integrity(完整性):對資料的操作與修改都是經過授權而不會被竄改
  • Availability(可用性):有權限的使用者可以即時且不中斷地存取資料

參考資料