1. 程式人生 > 實用技巧 >2020重新出發,MySql基礎,MySql的基本操作

2020重新出發,MySql基礎,MySql的基本操作

@目錄

MySQL資料庫的基本操作

MySQL 安裝好之後就可以進行資料庫的相關操作了。資料庫就像車庫一樣,每一個小區裡都有很多車庫用來存放車,它們都有唯一的車庫號。同樣,在 MySQL 中也可以建立多個不同名稱的資料庫儲存資料。

SQL 是一種專門用來與資料庫通訊的語言,我們使用 SQL 來操作資料庫。

資料庫的操作包括建立、刪除、修改資料庫,這些操作都是管理資料庫的基礎。

SQL是什麼?它能做什麼?

對資料庫進行查詢和修改操作的語言叫做 SQL(Structured Query Language,結構化查詢語言)。SQL 語言是目前廣泛使用的關係資料庫標準語言,是各種資料庫互動方式的基礎。

  • 著名的大型商用資料庫 Oracle、DB2、Sybase、SQL Server,開源的資料庫 PostgreSQL、MySQL,甚至一些小型的資料庫 Access 等都支援 SQL。近些年蓬勃發展的 NoSQL 系統最初是宣稱不再需要 SQL 的,後來也不得不修正為 Not Only SQL,來擁抱 SQL。

SQL 是一種資料庫查詢和程式設計語言,用於存取資料以及查詢、更新和管理關係資料庫系統。與其他程式設計語言(如 C語言、Java 等)不同的是,SQL 由很少的關鍵字組成,每個 SQL 語句通過一個或多個關鍵字構成。

Sql優點

SQL 具有如下優點。

  1. 一體化:SQL 集資料定義、資料操作和資料控制於一體,可以完成資料庫中的全部工作。
  2. 使用方式靈活:SQL 具有兩種使用方式,可以直接以命令方式互動使用;也可以嵌入使用,嵌入C、C++、Fortran、COBOL、Java 等語言中使用。
  3. 非過程化:只提操作要求,不必描述操作步驟,也不需要導航。使用時只需要告訴計算機“做什麼”,而不需要告訴它“怎麼做”,儲存路徑的選擇和操作的執行由資料庫管理系統自動完成。
  4. 語言簡潔、語法簡單:該語言的語句都是由描述性很強的英語單片語成,而且這些單詞的數目不多。

SQL包含

SQL 包含以下 4 部分:

  1. 資料定義語言(Data Definition Language,DDL):用來建立或刪除資料庫以及表等物件,主要包含以下幾種命令:
    • DROP:刪除資料庫和表等物件
    • CREATE:建立資料庫和表等物件
    • ALTER:修改資料庫和表等物件的結構
  2. 資料操作語言(Data Manipulation Language,DML):用來變更表中的記錄,主要包含以下幾種命令:
    1. SELECT:查詢表中的資料
    2. INSERT:向表中插入新資料
    3. UPDATE:更新表中的資料
    4. DELETE:刪除表中的資料
  3. 資料查詢語言(Data Query Language,DQL):用來查詢表中的記錄,主要包含 SELECT 命令,來查詢表中的資料。
  4. 資料控制語言(Data Control Language,DCL):用來確認或者取消對資料庫中的資料進行的變更。除此之外,還可以對資料庫中的使用者設定許可權。
    1. GRANT:賦予使用者操作許可權
    2. REVOKE:取消使用者的操作許可權
    3. COMMIT:確認對資料庫中的資料進行的變更
    4. ROLLBACK:取消對資料庫中的資料進行的變更

下面是一條 SQL 語句的例子,該語句宣告建立一個名叫 students 的表:

CREATE TABLE students (
    student_id INT UNSIGNED,
    name VARCHAR(30) ,
    sex CHAR(1),
    birth DATE,
    PRIMARY KEY(student_id)
);

該表包含 4 個欄位,分別為 student_id、name、sex、birth,其中 student_id 定義為表的主鍵。

現在只是定義了一張表格,但並沒有任何資料,接下來這條 SQL 宣告語句,將在 students 表中插入一條資料記錄:

INSERT INTO students (student_id, name, sex, birth)
VALUES (41048101, 'MySQL教程', '1', '2013-02-14');

執行完該 SQL 語句之後,students 表中就會增加一行新記錄,該記錄中欄位 student_id 的值為“41048101”,name 欄位的值為“MySQL教程”。sex 欄位值為“1”,birth 欄位值為“2013-02-14”。

再使用 SELECT 查詢語句獲取剛才插入的資料,如下:

SELECT name FROM students WHERE student_id=41048101;
+--------------+
| name         |
+--------------+
| MySQL教程     |
+--------------+

注意:SQL 語句不區分大小寫,許多 SQL 開發人員習慣對 SQL 本身的關鍵字進行大寫,而對錶或者列的名稱使用小寫,這樣可以提高程式碼的可閱讀性和可維護性。本教程也按照這種方式組織 SQL 語句。大多數資料庫都支援通用的 SQL 語句,同時不同的資料庫具有各自特有的 SQL 語言特性。

SQL的基本書寫規則

  1. SQL 語句要以分號;結尾:在 RDBMS (關係型資料庫)當中,SQL 語句是逐條執行的,一條 SQL 語句代表著資料庫的一個操作。
    • 我們通常在句子的句尾加註標點表示這句話結束,中文句子以句號結尾,英文以點號.結尾,而 SQL 語句則使用英文分號;結尾。
  2. SQL 語句不區分大小寫:SQL 不區分關鍵字的大小寫。例如,不管寫成 SELECT 還是 select,解釋都是一樣的。表名和列名也是如此。
    • 提示:關鍵字是資料庫事先定義的,有特別意義的單詞。
    • 雖然可以根據個人喜好選擇大寫還是小寫(或大小寫混雜)。
    • 需要注意的是,插入到表中的資料是區分大小寫的。例如,向資料庫中插入單詞 Computer、COMPUTER 或 computer,這三個是不一樣的資料
      • 在阿里巴巴 Java 開發手冊的 MySql 建表規約裡提到:【強制】表名、欄位名必須使用小寫字母或數字,禁止出現數字開頭,禁止兩個下劃線中間只出現數字。資料庫欄位名的修改代價很大,因為無法進行預釋出,所以欄位名稱需要慎重考慮。
      • 通俗的說就是,MySQL 在 Windows 系統下不區分大小寫,但在 Linux 系統下預設區分大小寫。因此,資料庫名、表名和欄位名,都不允許出現任何大寫字母,避免節外生枝。一般建議統一使用小寫字母,並且 InnoDB 引擎在其內部都是以小寫字母方式來儲存資料庫名和表名的。這樣可以有效的防止 MySQL 產生大小寫問題。
  3. 常數的書寫方式是固定的
    • SQL 語句常常需要直接書寫字串、日期或者數字。例如,書寫向表中插入字串、日期或者數字等資料的 SQL 語句。
    • 在 SQL 語句中直接書寫的字串、日期或者數字等稱為常數。常數的書寫方式如下所示:
      • SQL 語句中含有字串的時候,需要像 'abc' 這樣,使用英文單引號'將字串括起來,用來標識這是一個字串。
      • SQL 語句中含有日期的時候,同樣需要使用英文單引號將其括起來。日期的格式有很多種('26 Jan 2010' 或者'10/01/26' 等),本教程統一使用 '2020-01-26' 這種'年-月-日'的格式。
      • 在 SQL 語句中書寫數字的時候,不需要使用任何符號標識,直接寫成 1000 這樣的數字即可。
    • 注意:列名不是字串,不能使用單引號。在MySQL 中可以用倒引號```把表名和列名括起來。
  4. SQL 語句的單詞之間必須使用半形空格(英文空格)或換行符來進行分隔:沒有分隔的語句會發生錯誤,無法正常執行。
    • 不能使用全形空格(中文空格)作為單詞的分隔符,否則會發生錯誤,出現無法預期的結果。
    • SQL 語句中的標點符號必須都是英文狀態下的,即半形字。

MySQL檢視&顯示資料庫

資料庫可以看作是一個專門儲存資料物件的容器,每一個數據庫都有唯一的名稱,並且資料庫的名稱都是有實際意義的,這樣就可以清晰的看出每個資料庫用來存放什麼資料。在 MySQL 資料庫中存在系統資料庫和自定義資料庫,系統資料庫是在安裝 MySQL 後系統自帶的資料庫,自定義資料庫是使用者定義建立的資料庫。

在 MySQL 中,可使用 SHOW DATABASES 語句來檢視或顯示當前使用者許可權範圍以內的資料庫。檢視資料庫的語法格式為:

SHOW DATABASES [LIKE '資料庫名'];

語法說明如下:

  • LIKE 從句是可選項,用於匹配指定的資料庫名稱。LIKE 從句可以部分匹配,也可以完全匹配。
  • 資料庫名由單引號' '包圍。

系統資料庫

列出當前使用者可檢視的所有資料庫:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
6 row in set (0.22 sec)

可以發現,在上面的列表中有 6 個數據庫,它們都是安裝 MySQL 時系統自動建立的,其各自功能如下:

  • information_schema:主要儲存了系統中的一些資料庫物件資訊,比如使用者表資訊、列資訊、許可權資訊、字符集資訊和分割槽資訊等。
  • mysql:MySQL 的核心資料庫,主要負責儲存資料庫使用者、使用者訪問許可權等 MySQL 自己需要使用的控制和管理資訊。常用的比如在 mysql 資料庫的 user 表中修改 root 使用者密碼。
  • performance_schema:主要用於收集資料庫伺服器效能引數
  • sakila:MySQL 提供的樣例資料庫,該資料庫共有 16 張表,這些資料表都是比較常見的,在設計資料庫時,可以參照這些樣例資料表來完成所需的資料表。
  • sys:MySQL 5.7 安裝完成後會多一個 sys 資料庫。sys 資料庫主要提供了一些檢視,資料都來自於 performation_schema,主要是讓開發者和使用者更方便地檢視效能問題
  • world:world 資料庫是 MySQL 自動建立的資料庫,該資料庫中只包括 3 張資料表,分別儲存城市,國家和國家使用的語言等內容。

自定義資料庫

先建立一個名為 test_db 的資料庫:

mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.12 sec)

再使用 SHOW DATABASES 語句顯示許可權範圍內的所有資料庫名,如下所示:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| test_db            |
| world              |
+--------------------+
7 row in set (0.22 sec)

使用 LIKE 從句檢視資料庫

先建立三個資料庫,名字分別為 test_db、db_test、db_test_db。

  1. 使用 LIKE 從句,檢視與 test_db 完全匹配的資料庫:
mysql> SHOW DATABASES LIKE 'test_db';
+--------------------+
| Database (test_db) |
+--------------------+
| test_db            |
+--------------------+
1 row in set (0.03 sec)
  1. 使用 LIKE 從句,檢視名字中包含 test 的資料庫:
mysql> SHOW DATABASES LIKE '%test%';
+--------------------+
| Database (%test%)  |
+--------------------+
| db_test            |
+--------------------+
| db_test_db         |
+--------------------+
| test_db            |
+--------------------+
3 row in set (0.03 sec)
  1. 使用 LIKE 從句,檢視名字以 db 開頭的資料庫:
mysql> SHOW DATABASES LIKE 'db%';
+----------------+
| Database (db%) |
+----------------+
| db_test        |
+----------------+
| db_test_db     |
+----------------+
2 row in set (0.03 sec)
  1. 使用 LIKE 從句,檢視名字以 db 結尾的資料庫:
mysql> SHOW DATABASES LIKE '%db';
+----------------+
| Database (%db) |
+----------------+
| db_test_db     |
+----------------+
| test_db        |
+----------------+
2 row in set (0.03 sec)

MySQL建立資料庫

在 MySQL 中,可以使用 CREATE DATABASE 語句建立資料庫,語法格式如下:

CREATE DATABASE [IF NOT EXISTS] <資料庫名>
[[DEFAULT] CHARACTER SET <字符集名>] 
[[DEFAULT] COLLATE <校對規則名>];

[ ]中的內容是可選的。語法說明如下:

  • <資料庫名>:建立資料庫的名稱。MySQL 的資料儲存區將以目錄方式表示 MySQL 資料庫,因此資料庫名稱必須符合作業系統的資料夾命名規則,不能以數字開頭,儘量要有實際意義。注意在 MySQL 中不區分大小寫。
  • IF NOT EXISTS:在建立資料庫之前進行判斷,只有該資料庫目前尚不存在時才能執行操作。此選項可以用來避免資料庫已經存在而重複建立的錯誤。
  • [DEFAULT] CHARACTER SET:指定資料庫的字符集。指定字符集的目的是為了避免在資料庫中儲存的資料出現亂碼的情況。如果在建立資料庫時不指定字符集,那麼就使用系統的預設字符集。
  • [DEFAULT] COLLATE:指定字符集的預設校對規則。

注意:MySQL 的字符集(CHARACTER)和校對規則(COLLATION)是兩個不同的概念。字符集是用來定義 MySQL 儲存字串的方式,校對規則定義了比較字串的方式。後面我們會單獨講解 MySQL 的字符集和校對規則。

建立 MySQL 資料庫例項

在 MySQL 中建立一個名為 test_db 的資料庫。

在 MySQL 命令列客戶端輸入 SQL 語句CREATE DATABASE test_db;即可建立一個數據庫,輸入的 SQL 語句與執行結果如下。

mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.12 sec);

“Query OK, 1 row affected (0.12 sec);”提示中,

  • “Query OK”表示上面的命令執行成功,
  • “1 row affected”表示操作隻影響了資料庫中一行的記錄,
  • “0.12 sec”則記錄了操作執行的時間。

若再次輸入CREATE DATABASE test_db;語句,則系統會給出錯誤提示資訊,如下所示:

mysql> CREATE DATABASE test_db;
ERROR 1007 (HY000): Can't create database 'test_db'; database exists

提示不能建立“test_db”資料庫,資料庫已存在。MySQL 不允許在同一系統下建立兩個相同名稱的資料庫。

可以加上IF NOT EXISTS從句,就可以避免類似錯誤,如下所示:

mysql> CREATE DATABASE IF NOT EXISTS test_db;
Query OK, 1 row affected (0.12 sec)

建立 MySQL 資料庫時指定字符集和校對規則

使用 MySQL 命令列工具建立一個測試資料庫,命名為 test_db_char,指定其預設字符集為 utf8,預設校對規則為 utf8_chinese_ci(簡體中文,不區分大小寫),輸入的 SQL 語句與執行結果如下所示:

mysql> CREATE DATABASE IF NOT EXISTS test_db_char
  -> DEFAULT CHARACTER SET utf8
  -> DEFAULT COLLATE utf8_chinese_ci;
Query OK, 1 row affected (0.03 sec)

這時,可以使用SHOW CREATE DATABASE檢視 test_db_char 資料庫的定義宣告,發現該資料庫的指定字符集為 utf8,執行結果如下所示:

mysql> SHOW CREATE DATABASE test_db_char;
+--------------+-----------------------------------------------------+
| Database     | Create Database                                     |
+--------------+-----------------------------------------------------+
| test_db_char | CREATE DATABASE `test_db_char` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------------+-----------------------------------------------------+
1 row in set (0.00 sec)

“1 row in set (0.00 sec)”表示集合中有 1 行資訊,處理時間為 0.00秒。時間為 0.00 秒並不代表沒有花費時間,而是時間非常短,小於 0.01 秒。

MySQL修改資料庫

在 MySQL 資料庫中只能對資料庫使用的字符集和校對規則進行修改,資料庫的這些特性都儲存在 db.opt 檔案中。

在 MySQL 中,可以使用 ALTER DATABASE 來修改已經被建立或者存在的資料庫的相關引數。修改資料庫的語法格式為:

ALTER DATABASE [資料庫名] { 
[ DEFAULT ] CHARACTER SET <字符集名> |
[ DEFAULT ] COLLATE <校對規則名>}

語法說明如下:

  • ALTER DATABASE 用於更改資料庫的全域性特性。
  • 使用 ALTER DATABASE 需要獲得資料庫 ALTER 許可權。
  • 資料庫名稱可以忽略,此時語句對應於預設資料庫。
  • CHARACTER SET 子句用於更改預設的資料庫字符集。

MySQL刪除資料庫

當資料庫不再使用時應該將其刪除,以確保資料庫儲存空間中存放的是有效資料。刪除資料庫是將已經存在的資料庫從磁碟空間上清除,清除之後,資料庫中的所有資料也將一同被刪除。

在 MySQL 中,當需要刪除已建立的資料庫時,可以使用 DROP DATABASE 語句。其語法格式為:

DROP DATABASE [ IF EXISTS ] <資料庫名>

語法說明如下:

  • <資料庫名>:指定要刪除的資料庫名。
  • IF EXISTS:用於防止當資料庫不存在時發生錯誤。
  • DROP DATABASE:刪除資料庫中的所有表格並同時刪除資料庫。使用此語句時要非常小心,以免錯誤刪除。如果要使用 DROP DATABASE,需要獲得資料庫 DROP 許可權。

注意:MySQL 安裝後,系統會自動建立名為 information_schema 和 mysql 的兩個系統資料庫,系統資料庫存放一些和資料庫相關的資訊,如果刪除了這兩個資料庫,MySQL 將不能正常工作。

注意:使用 DROP DATABASE 命令時要非常謹慎,在執行該命令後,MySQL 不會給出任何提示確認資訊。DROP DATABASE 刪除資料庫後,資料庫中儲存的所有資料表和資料也將一同被刪除,而且不能恢復。因此最好在刪除資料庫之前先將資料庫進行備份

MySQL選擇資料庫

在 MySQL 中就有很多系統自帶的資料庫,那麼在操作資料庫之前就必須要確定是哪一個資料庫。

在 MySQL 中,USE 語句用來完成一個數據庫到另一個數據庫的跳轉。

當用 CREATE DATABASE 語句建立資料庫之後,該資料庫不會自動成為當前資料庫,需要用 USE 來指定當前資料庫。其語法格式為:

USE <資料庫名>

該語句可以通知 MySQL 把<資料庫名>所指示的資料庫作為當前資料庫。該資料庫保持為預設資料庫,直到語段的結尾,或者直到遇見一個不同的 USE 語句。

只有使用 USE 語句來指定某個資料庫作為當前資料庫之後,才能對該資料庫及其儲存的資料物件執行操作。

資料庫設計的三大正規化

為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中,這種規則就是正規化。正規化是符合某一種級別的關係模式的集合。關係型資料庫中的關係必須滿足一定的要求,即滿足不同的正規化。

目前關係型資料庫有六種正規化,分別為:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、第四正規化(4NF)、第五正規化(5NF)和第六正規化(6NF)。要求最低的正規化是第一正規化。第二正規化在第一正規化的基礎上又進一步的添加了要求,其餘正規化依次類推。

一般說來,資料庫只需滿足第三正規化就行了,而通常我們用的最多的就是第一正規化、第二正規化、第三正規化,也就是接下來要講的“三大正規化”。

第一正規化

第一正規化(1NF)用來確保每列的原子性,要求每列(或者每個屬性值)都是不可再分的最小資料單元(也稱為最小的原子單元)。

  • 例如,客人住宿資訊表 (姓名, 客人編號, 地址, 客房號, 客房描述, 客房型別, 客房狀態, 床位數, 入住人數, 價格)。
    • 其中,“地址”列還可以細分為國家、省、市、區等,甚至有的程式還把“姓名”列也拆分為“姓”和“名”等。如果業務需求中不需要拆分“地址”和“姓名”列,則該資料表符合第一正規化,如果需要將“地址”列拆分,則下列寫法符合第一正規化:
      • 客人住宿資訊表(姓名, 客人編號, 國家, 省, 市, 區, 門牌號, 客房號, 客房描述, 客房型別, 客房狀態, 床位數, 入住人數, 價格)。

第二正規化

第二正規化(2NF)在第一正規化的基礎上更進一層,要求表中的每列都和主鍵相關,即要求實體的唯一性。如果一個表滿足第一正規化,並且除了主鍵以外的其他列全部都依賴於該主鍵,那麼該表滿足第二正規化。

客人住宿資訊表中的資料主要用來描述客人住宿資訊,所以該表主鍵為(客人編號,客房號):

  • “姓名”列、“地址”列➡“客人編號”列。
  • “客房描述”列、 “客房型別”列、“客房狀態”列、“床位數”列、“入住人數”列、“價格”列➡“客房號”列。

其中,“➡”符號代表依賴。以上各列沒有全部依賴於主鍵(客人編號,客房號),只是部分依賴於主鍵,不符合第二正規化。

使用第二正規化後,客人住宿資訊表可以分解成以下兩個表:

  • 客人資訊表(客人編號,姓名,地址,客房號,入住時間,結賬日期,押金,總金額),主鍵為“客人編號”列,其他列都全部依賴於主鍵列。
  • 客房資訊表(客房號,客房描述,客房型別,客房狀態,床位數,入住人數,價格),主鍵為“客房號”列,其他列都全部依賴於主鍵列。

第三正規化

第三正規化(3NF)在第二正規化的基礎上更進一層,第三正規化是確保每列都和主鍵列直接相關,而不是間接相關,即限制列的冗餘性。如果一個關係滿足第二正規化,並且除了主鍵以外的其他列都依賴於主鍵列,列和列之間不存在相互依賴關係,則滿足第三正規化。

為了更好的理解第三正規化,這裡我們需要了解傳遞依賴。假設A、B 和 C 是關係 R 的三個屬性,如果 A➡B 且 B➡C,則從這些函式依賴中,可以得出 A➡C。如上所述,依賴 A➡C 稱之為傳遞依賴。

以第二正規化中的客房資訊表為例,初看該表時沒有問題,滿足第三正規化,每列都和主鍵列“客房號”相關,再細看會發現:

  • "床位數” 列、“價格”列➡“客房型別”列。
  • “客房型別”列➡“客房號”列。
  • “床位數”列、“價格”列➡“客房號”列

為了滿足第三正規化,應該去掉“床位數”列,“價格”列和“客房型別”列,將客房資訊表分解為如下兩個表。

  • 客房表(客房號,客房描述,客房型別編號,客房狀態,入住人數)
  • 客房型別表(客房型別編號,客房型別名稱,床位數,價格)

主鍵與外來鍵在多表中的重複出現不屬於資料冗餘,非鍵欄位的重複出現才是資料冗餘。在客房表中客房狀態存在冗餘,需要進行規範化,規範化以後的表如下:

  • 客房表(客房號,客房描述,客房型別編號,客房狀態編號,入住人數)。
  • 客房狀態表(客房狀態編號,客房狀態名稱)

最後,滿足三大正規化的 E-R 圖如下所示:

反正規化化

不滿足正規化的資料庫設計,就是反正規化化。

我們需要知道對於專案的終端使用者來說,使用者關心的是方便,清晰的資料結果。所以在設計資料庫時,設計人員和客戶在資料庫的設計規範化和效能之間會有一定的矛盾。

上面我們通過三大正規化將客房表分解出兩個表,為了滿足客戶的需求,最終可能需要通過三個或四個表之間的連線查詢,來得到客戶需要的資料結果,插入資料同樣如此,對於客戶輸入的資料,我們需要分開插入到三個或四個不同的表中。

由此可以看出,為了滿足三大正規化,我們的資料操作效能會受到相應的影響。

所以,在實際的資料庫設計中,既要考慮三大正規化,避免資料的冗餘和各種資料操作異常,又要考慮資料訪問效能。為了減少表連線,提高資料庫的訪問效能,也可以允許適當的資料冗餘列,這也許就是最合適的資料庫設計方案。

  • 比如,有一張存放商品的基本表,資料表中包括“單價”、“數量”“金額”等欄位。“金額”這個欄位就說明該表的設計不滿足第三正規化,因為“金額”可以由“單價”乘以“數量”得到,說明“金額”是冗餘欄位。

與第三正規化中介紹的冗餘相比,前面介紹的冗餘屬於低階冗餘,我們反對低階冗餘,但這裡的冗餘為高階冗餘,目的是提高資料的處理速度,增加“金額”列後,可以提高查詢統計的速度,這是以空間換取時間的做法。

注意:不要輕易違反資料庫設計的規範化原則,如果處理不好,可能會適得其反,使應用程式執行速度更慢。

優缺點

正規化化

優點如下:

  • 減少資料冗餘
  • 正規化化後的表中只有很少的重複資料,更新時只需要更新較少的資料,所以正規化化的更新操作比反正規化化更快
  • 正規化化的表通常比反正規化化更小

缺點如下:

  • 正規化化的表在查詢時經常需要很多的關聯,這回導致效能降低
  • 增加了索引優化的難度

反正規化化

優點如下:

  • 可以減少表的關聯
  • 可以更好的進行索引優化

缺點如下:

  • 資料表存在資料冗餘及資料維護異常
  • 對資料的修改需要更多的成本