數據庫基礎回顧

數據庫基礎回顧

數據庫用來做什麼?為什麼要用數據庫

數據庫就是用來存儲數據的。

我們可以用文本文檔,excel文檔,文件夾中的各種文件來存儲數據。那麼用數據庫存儲數據有什麼優點?

相對於其它方式,用數據庫存儲數據有以下優點:

  • 解決數據的大小問題,可存儲大量數據
  • 容易更新
  • 準確性
  • 解決數據冗餘,比如在excel中有成千上萬的數據不容易查找重複的數據
  • 更安全,比如用文件的方式容易洩露數據
  • 重要性,數據更安全,數據庫更容易容災備份

數據庫的相關概念

使用主鍵管理數據唯一性

使用主鍵和外鍵管理一對多的數據

使用聯合表管理多對多的數據(一般該表中只有兩列,每列對應另外一個表中的主鍵)

DBMS (Database management system)數據庫管理系統,用來管理數據庫,嚴格的說我們通常說的Oracle,MS SQL,DB2等都是DBMS而不是數據庫。

ACID原則:(Atomic Consistent Isolated Durable)數據庫中事務的幾個原則

  • 原子性:要麼全部成功,要麼全部不成功,回到最初狀態;
  • 一致性:所有事務不管併發還是穿行執行後數據是一致的;
  • 隔離性: 同一時間只有一個請求作用於同一數據;
  • 持久性:事務完成後,該事務對數據庫所做的更改便持久的保存在數據庫中,並不會被回滾。

SQL:(Structured query language)是申明式查詢語言,用來做在數據庫中做CRUD(Create Read Update Delete)創建讀取更新刪除操作

SQL中支持的運算符:>

<> >= <= AND OR

字符串使用單引號

可使用LIKE like 'a_c' 可匹配abc acc adc等等

使用LIKE 'my%' 可匹配my開頭的任意字符串

是否為空 IS NULL, IS NOT NULL

聚合函數:MAX MIN COUNT SUM AVG GROUP BY

JOIN table ON (默認為內聯)

外聯:LEFT OUTER JOIN 左邊的表中的數據會全部列出

RIGHT OUTER JOIN 右邊的表中的數據會全部列出

數據庫建模需要考慮的問題:

  • 我創建這個數據庫是用來做什麼?
  • 我已經有什麼?(已有的數據,人員儲備,現有數據庫)
  • 有哪些entities?(你的實際業務對象)
  • 每個entity有哪些屬性?(規範屬性命名,屬性類型,是否必須,是否需要Unicode,是否有缺省值)

組合鍵:單個鍵不是唯一,組合後是唯一的

ER 圖(Entity relationship diagram):便於理解數據庫中的邏輯關係

參考完整性:數據庫中為保障數據一致性和完整性的強制規則,比如不能插入外鍵不存在的數據

關係型數據庫的範式(Normalization Format):

  • 第一範式(1NF):每列數據只存一個數據,而不是數據集合
  • 第二範式(2NF):首先需要滿足第一範式,其次表中非鍵值的列依賴於鍵值(只在有組合鍵的時候需要考慮)
  • 第三範式(3NF):首先需要滿足第二範式,其次沒有非鍵值的列依賴於別的非鍵值的列

有時候為了性能會破壞範式

DDL (Data Definition language)用來定義數據庫的schema

VARCHAR(variable length character)可變長字符串,是數據庫表中某列的數據類型,其優點可變長靈活,但固定長度可能更節省空間和效率。

索引:clustered index(主鍵索引)non-clustered index 非主鍵索引,索引可以大大提高查詢效率,但是如果數據庫表中未每一個列都做索引會大大阻礙數據寫入效率,因為會增加插入索引表的時間。

事務鎖

為了保證數據不會被同時修改發生差錯,引入事務鎖的概念,在同一時間,只能有一個請求可以操作同一數據。

悲觀鎖(Pessimistic locking ),總是假設最壞的情況,每次取數據時都認為其他線程會修改,所以都會加鎖(讀鎖、寫鎖、行鎖等),當其他線程想要訪問數據時,都需要阻塞掛起。

樂觀鎖(Optimistic locking),總是認為不會產生併發問題,每次去取數據的時候總認為不會有其他線程對數據進行修改,因此不會上鎖,但是在更新時會判斷其他線程在這之前有沒有對數據進行修改。

存儲過程:將SQL作為函數存儲在數據庫中供外部調用,好處是DBA可以進行充分優化,可以傳遞參數,可避免SQL注入

ORM(object-relational mapping)對象關係映射,為編程語言和關係型數據庫表之間做對象關係映射

數據庫基礎回顧

數據庫的分類

  • 關係型數據庫:目前最成熟應用最廣泛的數據庫
  • 對象數據庫:為了解決面向對象編程和原有關係型數據庫的表不匹配的痛點
  • 鍵值數據庫:數據作為鍵和值存儲
  • 文檔數據庫:數據作為文檔存儲
  • 圖數據庫:更加側重數據中的關係和連接
  • NoSQL數據庫:NoSQL數據庫已經演變為Not only SQL數據庫,表示不僅僅是sql數據庫,是一種新型的數據庫類型,它包括上面的文檔數據庫,圖數據庫等

在傳統關係型數據庫和NoSQL數據庫中選擇:

你是否需要彈性的schema?如果你的數據庫schema經常變動,NOSQL會是更好的選擇。

你是否有非常大量的數據?如果你的數據量非常大,NOSQL也許更適合你。

你最在意擴展性還是數據一致性?數據一致性是關係型數據的強項,相對來說NOSQL數據庫的擴展性可能更好。


分享到:


相關文章: