iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

富士大顆系列 第 24

vol. 24 資料庫也可以很多型:資料庫類型與資料模型

  • 分享至 

  • xImage
  •  

你好,我是富士大顆 Aiko

由於面試被問及資料庫的問題不勝枚舉
顯然這是一個相當重要的基本知識!
所以這篇會談到:

  • 資料庫類型
  • 資料模型
  • 資料庫的多型

傻眼,從面試去回推不也是一種 TDD...


資料庫類型

資料庫類型 特色 使用情景 實際使用範例 基本語法
關聯式資料庫(RDBMS) 使用表格(table)來儲存資料,並且這些表格之間有關聯。 需要高度結構化和交易完整性的應用。 MySQL 被 WordPress 用於儲存網站內容。 SQL,例如 SELECT * FROM users WHERE age > 21;
NoSQL 資料庫 相對關聯式資料,用於儲存半結構化或非結構化資料。 需要高度擴展性和靈活性的應用。 MongoDB 被 Uber 用於實時地理位置追蹤。 JavaScript 風格的查詢,例如 db.collection.find({name: 'John'})
時序資料庫(Time-series DB) 時間序列資料設計。 物聯網(IoT)監控、股票市場分析等。 InfluxDB 常被用於 DevOps 監控和實時分析。 InfluxQL,例如 SELECT * FROM temperature WHERE time > now() - 1h;
圖形資料庫(Graph DB) 圖形結構的資料設計。 社交網絡、推薦系統、知識光譜等。 Neo4j 被用於 LinkedIn 的人脈網絡分析。 Cypher 查詢語言,例如 MATCH (a:Person)-[:FRIEND]->(b:Person) RETURN a, b;

關聯式資料庫(Relational Database Management System, RDBMS)

發展歷史

  • 關聯式資料庫的概念最早由 E.F. Codd 在 1970 年提出。當時他發表了一篇名為 "A Relational Model of Data for Large Shared Data Banks" 的論文。
  • SQL(Structured Query Language,結構化查詢語言)則是在 RDBMS 概念被提出不久後而開發出來的,用於進行關聯式資料庫的查詢和管理。
  • 早期的應用包括 IBM 的 System R 和 Oracle。
  • 隨著時間的推移,多種關聯式資料庫系統如 MySQL、PostgreSQL、SQLite 等出現。

特色

  • 使用表格(table)來儲存資料。
  • 關聯資料用外鍵(foreign key)連結。
  • 支援 SQL(Structured Query Language)進行資料操作。

使用情境

  • 高度結構化的資料儲存。
  • 交易完整性(ACID:原子性、一致性、隔離性、持久性)。
  • 複雜查詢。

基本語法

  • SQL,例如 SELECT * FROM users WHERE age > 21;
  • 關鍵字包括 SELECT, FROM, WHERE, JOIN 等。

目前發展

  • 隨著雲端運算興起,許多關聯式資料庫也提供了雲端版本,例如 Amazon RDS、Azure SQL Database。
  • 新的查詢優化和資料分析工具不斷出現,使得關聯式資料庫能更好地應對大數據和實時分析。

MySQL/SQLite/PostgreSQL 這三種開源資料庫的差別?

敏捷和善的海豚:MySQL

  • 社群:有著廣大的社群和豐富的文件。
  • 多種儲存引擎:支援多種儲存引擎,如 InnoDB(支援事務(Transaction)和外鍵,適用高一致性)和 MyISAM(讀取速度快,但不支援事務)。
  • 可用性和擴展性高:支援主從複製(Master-Slave Replication,所有的寫入操作都首先發生在主伺服器上,然後這些更改會被複製到一個或多個從伺服器上)
    、分片(Sharding,資料被分成多個部分(或“分片”),每個部分儲存在不同的伺服器或集群上,資料庫能有效地擴展,以處理更多資料和請求)等,適用於大規模需求。
  • 廣泛應用:從網站、雲端到大數據應用,MySQL 的應用場景非常廣泛。
  • 管理工具:提供了多種管理和優化工具,如 MySQL Workbench。

輕薄短小好攜帶:SQLite

  • 輕量級和嵌入式:SQLite 是一個輕量級的資料庫,適用於移動應用(Mobile Applications,智慧型手機、平板或其他移動設備設計的軟體應用)和嵌入式系統(Embedded Systems,如:智慧家電、汽車、工業器具等)。
  • 無伺服器架構:不需要資料庫伺服器,直接以檔案形式存在本地。
  • 事務支援:雖然是輕量級,但也支援事務(Transaction)。
  • 簡單易用:API 簡單,容易整合到各種應用中。
  • 局限:不適合高並發(High Concurrency,系統需要能夠快速地接收、處理和回應多個請求,而不出現延遲或錯誤)因此不適合大規模資料的寫入和儲存。

穩若泰山的大象:PostgreSQL

  • 先進的功能:支援多種先進的資料類型(如 JSON、XML)和操作(如地理空間查詢)。
  • 高度可擴展:支援多種套件。
  • 強大的查詢優化器:具有成熟的查詢優化算法,能有效地執行複雜查詢。
  • 事務和一致性:支援 ACID 事務和多版本並發控制(MVCC, Multi-Version Concurrency Control,管理多個 user 同時操作資料庫的技術)。
  • 社群:有活躍的開發社群。

另外還有幾個需要 $$ 的資料庫:

  • Microsoft SQL Server:由微軟公司開發,是一個商業資料庫。
  • Oracle Database:由甲骨文(Oracle)公司開發,也是一個商業資料庫,廣泛用於大型企業應用。
  • IBM Db2:由 IBM 開發,主要用於高交易量的企業級應用。

資料模型

模型 model 是什麼意思?

在資料庫中,資料模型定義了資料庫中的資料結構、資料之間的關係,以及如何對資料進行操作和儲存。

常見的資料模型:

  • 關聯模型(Relational Model):用於關聯式資料庫,如 MySQL、PostgreSQL。

  • 文件模型(Document Model):在文件模型中,資料通常以 JSON 或 BSON(Binary JSON)格式儲存。

  • 圖形模型(Graph Model):資料以節點(Nodes)和邊(Edges)的形式表示。節點通常表示實體(例如人、地點等),而邊則用表示節點之間的關係(例如朋友、屬於等)。

關聯性資料模型

在關聯式資料庫中,資料模型通常由資料表(Tables)、欄位(Columns)、主鍵(Primary Keys)、外鍵(Foreign Keys)、索引(Indexes)和視圖(Views)等組成。

Tables and Columns

  • Table:相關資料的集合。例如,一個學生資料表可能包含學生的姓名、學號和年齡等。

  • Column:資料表中的一個屬性或特性。例如,學生表可能有姓名、學號和年齡等欄位。

Primary Keys and Foreign Keys

  • 主鍵(Primary Key):唯一識別資料表中的每一條記錄。例如,在學生資料表中,學號可能是主鍵,因其唯一且不可重複,以及不能有空值。

  • 外鍵(Foreign Key):用於與另一個資料表的主鍵建立關聯。例如,在成績資料表中,學號可能是外鍵,用於與學生資料表中的學號(主鍵)建立關聯。所以通常主鍵(學號)會成為關聯資料表(成績資料表)的外鍵。

Index

索引是一種資料結構,用於快速查找資料表中的記錄。通常索引是基於主鍵或其他常用查詢的欄位建立的。例如,你可能會在學生表的姓名欄位上建立一個索引,也就是以姓名進行排序分類,類似字典裡面的筆畫或注音。

view

view 是一種虛擬的資料表,將查詢結果呈現出來。通常用於將複雜的 SQL 查詢結果以簡單的方式呈現。


學生資料表作為範例

總共有三個資料表:

學生表(Students)

  • 學號(StudentID):主鍵
  • 姓名(Name)
  • 年齡(Age)

課程表(Courses)

  • 課程編號(CourseID):主鍵
  • 課程名稱(CourseName)

選課表(Enrollments)

  • 學號(StudentID):外鍵,參照學生表
  • 課程編號(CourseID):外鍵,參照課程表

在這個例子中:

關聯性:學生表跟課程表彼此透過第三方資料表選課表進行關聯,因此可以使用學號與課程編號互相查詢。

主鍵和外鍵的限制:選課表中的學號和課程編號必須是學生表和課程表中已存在的值。

複合主鍵:選課表的主鍵是由學號(StudentID)和課程編號(CourseID)的組合成的,有時被稱為複合主鍵(Composite Primary Key)。

使用索引:另外,我們可以在學生表的姓名欄位和課程表的課程名稱欄位上建立索引,以加速查詢。這樣,當我們需要查找某個學生選了哪些課,或者某個課程有哪些學生選擇時,就非常快速和方便。


想一想,使用第三方表格和使用索引的差別是什麼?


資料庫的多型

資料庫的多型(Polymorphism)通常不同於程式設計中的多型概念,但基本的思想是相似的,也就是允許不同類型的實體共享相同的介面或屬性。

在資料庫領域中,多型體現在:

  1. 資料模型:一個資料庫系統可以支援多種資料模型,例如 ArangoDB 就可以在同一個資料庫中儲存關聯式資料、JSON 文件和圖形資料。

  2. 查詢:某些資料庫允許使用多種查詢語言,例如 SQL 和 NoSQL,或者支援多種索引。

在 PostgreSQL 資料庫中,可以使用 SQL 查詢來得到關聯式資料,同時也可以使用 JSON 函數來查詢儲存在 JSONB 中的資料。

-- SQL 查詢
SELECT * FROM students WHERE age > 20;

-- JSON 查詢
SELECT * FROM students WHERE info->>'grade' = 'A';
  1. 實體:在一個關聯式資料庫中,可能有一個名為物件的表,其中包含多種不同類型的物件,每種都有不同的屬性。這可以使用額外的屬性(如類型)或者使用不同的相關表來實現。

有一個名為 items 的表,其中有一個 type 屬性來區分不同類型的物品(例 bookmovie):

SELECT * FROM items WHERE type = 'book';
  1. 繼承和擴展:某些資料庫支援表的繼承,也就是說可以新增一個基本表,然後新增一個或多個繼承自該表的擴展表。

在 PostgreSQL 中,可以新增一個名為 person 的基本表,然後新增一個繼承自 person 的 student 表:

CREATE TABLE person (id SERIAL PRIMARY KEY, name TEXT);
CREATE TABLE student () INHERITS (person);
  1. 多型關聯:像 Ruby on Rails 這樣的 ORM 框架中,多型關聯允許一個模型屬於多個其他類型的模型。

使用多型關聯來讓一個 Comment 模型屬於多個不同的模型:

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
end

class Article < ApplicationRecord
  has_many :comments, as: :commentable
end

class Video < ApplicationRecord
  has_many :comments, as: :commentable
end

下一篇,會介紹 SQL 的重點關鍵字的使用!
(可能會有正規化)


上一篇
vol. 23 Rails 的「測試-測試-測試!」:筆試直接寫起來!(下)
下一篇
vol. 25 資料庫的 SQL 看這篇(應該)就懂了
系列文
富士大顆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言