你好,我是富士大顆 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; |
SELECT * FROM users WHERE age > 21;
SELECT
, FROM
, WHERE
, JOIN
等。另外還有幾個需要 $$ 的資料庫:
在資料庫中,資料模型定義了資料庫中的資料結構、資料之間的關係,以及如何對資料進行操作和儲存。
常見的資料模型:
關聯模型(Relational Model):用於關聯式資料庫,如 MySQL、PostgreSQL。
文件模型(Document Model):在文件模型中,資料通常以 JSON 或 BSON(Binary JSON)格式儲存。
圖形模型(Graph Model):資料以節點(Nodes)和邊(Edges)的形式表示。節點通常表示實體(例如人、地點等),而邊則用表示節點之間的關係(例如朋友、屬於等)。
在關聯式資料庫中,資料模型通常由資料表(Tables)、欄位(Columns)、主鍵(Primary Keys)、外鍵(Foreign Keys)、索引(Indexes)和視圖(Views)等組成。
Table:相關資料的集合。例如,一個學生資料表可能包含學生的姓名、學號和年齡等。
Column:資料表中的一個屬性或特性。例如,學生表可能有姓名、學號和年齡等欄位。
主鍵(Primary Key):唯一識別資料表中的每一條記錄。例如,在學生資料表中,學號可能是主鍵,因其唯一且不可重複,以及不能有空值。
外鍵(Foreign Key):用於與另一個資料表的主鍵建立關聯。例如,在成績資料表中,學號可能是外鍵,用於與學生資料表中的學號(主鍵)建立關聯。所以通常主鍵(學號)會成為關聯資料表(成績資料表)的外鍵。
索引是一種資料結構,用於快速查找資料表中的記錄。通常索引是基於主鍵或其他常用查詢的欄位建立的。例如,你可能會在學生表的姓名欄位上建立一個索引,也就是以姓名進行排序分類,類似字典裡面的筆畫或注音。
view 是一種虛擬的資料表,將查詢結果呈現出來。通常用於將複雜的 SQL 查詢結果以簡單的方式呈現。
總共有三個資料表:
在這個例子中:
關聯性:學生表跟課程表彼此透過第三方資料表選課表進行關聯,因此可以使用學號與課程編號互相查詢。
主鍵和外鍵的限制:選課表中的學號和課程編號必須是學生表和課程表中已存在的值。
複合主鍵:選課表的主鍵是由學號(StudentID)和課程編號(CourseID)的組合成的,有時被稱為複合主鍵(Composite Primary Key)。
使用索引:另外,我們可以在學生表的姓名欄位和課程表的課程名稱欄位上建立索引,以加速查詢。這樣,當我們需要查找某個學生選了哪些課,或者某個課程有哪些學生選擇時,就非常快速和方便。
資料庫的多型(Polymorphism)通常不同於程式設計中的多型概念,但基本的思想是相似的,也就是允許不同類型的實體共享相同的介面或屬性。
在資料庫領域中,多型體現在:
資料模型:一個資料庫系統可以支援多種資料模型,例如 ArangoDB 就可以在同一個資料庫中儲存關聯式資料、JSON 文件和圖形資料。
查詢:某些資料庫允許使用多種查詢語言,例如 SQL 和 NoSQL,或者支援多種索引。
在 PostgreSQL 資料庫中,可以使用 SQL 查詢來得到關聯式資料,同時也可以使用 JSON 函數來查詢儲存在 JSONB 中的資料。
-- SQL 查詢
SELECT * FROM students WHERE age > 20;
-- JSON 查詢
SELECT * FROM students WHERE info->>'grade' = 'A';
物件
的表,其中包含多種不同類型的物件,每種都有不同的屬性。這可以使用額外的屬性(如類型
)或者使用不同的相關表來實現。有一個名為 items 的表,其中有一個 type 屬性來區分不同類型的物品(例 book
、movie
):
SELECT * FROM items WHERE type = 'book';
在 PostgreSQL 中,可以新增一個名為 person 的基本表,然後新增一個繼承自 person 的 student 表:
CREATE TABLE person (id SERIAL PRIMARY KEY, name TEXT);
CREATE TABLE student () INHERITS (person);
使用多型關聯來讓一個 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 的重點關鍵字的使用!
(可能會有正規化)