自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL 的 JSON 類型,違反第一范式嗎?

數(shù)據(jù)庫(kù) MySQL
網(wǎng)上很多人關(guān)于 JSON 違反了數(shù)據(jù)庫(kù)第一范式的爭(zhēng)議,那么,JSON 真對(duì)違反了數(shù)據(jù)庫(kù)第一范式嗎?我們來(lái)聊一聊。

在 字節(jié)2面:為了性能,你會(huì)違反數(shù)據(jù)庫(kù)三范式嗎?這篇文章中,我們分析了數(shù)據(jù)庫(kù)的三范式,MySQL 在 5.7 版本中正式引入了原生的 JSON 數(shù)據(jù)類型,網(wǎng)上很多人關(guān)于 JSON 違反了數(shù)據(jù)庫(kù)第一范式的爭(zhēng)議,那么,JSON 真對(duì)違反了數(shù)據(jù)庫(kù)第一范式嗎?我們來(lái)聊一聊。

一、MySQL的JSON

MySQL 在 5.7 版本中正式引入了原生的 JSON 數(shù)據(jù)類型,接下來(lái)我們來(lái)詳細(xì)地介紹 JSON相關(guān)的信息。

1. MySQL 5.7 中的 JSON 支持

發(fā)布日期:MySQL 5.7 正式發(fā)布于 2015 年10月。

JSON 數(shù)據(jù)類型:在此版本中,MySQL 引入了 JSON 類型,允許開(kāi)發(fā)者在表中存儲(chǔ)和操作 JSON 格式的數(shù)據(jù)。這不僅提高了處理半結(jié)構(gòu)化數(shù)據(jù)的效率,還帶來(lái)了更多的靈活性。

功能特性:

  • 驗(yàn)證:MySQL 會(huì)自動(dòng)驗(yàn)證存儲(chǔ)在 JSON 列中的數(shù)據(jù)是否為有效的 JSON 格式。
  • 高效存儲(chǔ):JSON 數(shù)據(jù)以二進(jìn)制格式存儲(chǔ),優(yōu)化了存儲(chǔ)空間和訪問(wèn)速度。
  • 內(nèi)置函數(shù):MySQL 5.7 提供了一系列與 JSON 操作相關(guān)的函數(shù),如 JSON_EXTRACT、JSON_SET、JSON_ARRAY 等,方便對(duì) JSON 數(shù)據(jù)進(jìn)行查詢和修改。
  • 索引支持:雖然初期對(duì) JSON 索引的支持有限,但通過(guò)生成虛擬列并在這些列上創(chuàng)建索引,可以提高查詢性能。

2. 后續(xù)版本的改進(jìn)

MySQL 8.0:在隨后的 MySQL 8.0 版本中,JSON 支持得到了進(jìn)一步增強(qiáng),包括:

  • 更豐富的 JSON 函數(shù):新增了更多操作 JSON 數(shù)據(jù)的函數(shù),如 JSON_TABLE 等。
  • 性能優(yōu)化:提升了 JSON 數(shù)據(jù)的處理性能,特別是在大規(guī)模數(shù)據(jù)集上的表現(xiàn)。

更好的與 SQL 標(biāo)準(zhǔn)的兼容性。

為了更好地理解 MySQL 的 JSON 數(shù)據(jù)類型,下面給出了一個(gè)使用 JSON 數(shù)據(jù)類型的簡(jiǎn)單示例。

CREATE TABLEusers (
    idINT AUTO_INCREMENT PRIMARY KEY,
    nameVARCHAR(100),
    attributesJSON
);

INSERTINTOusers (name, attributes) VALUES
('Alice', '{"age": 30, "city": "New York"}'),
('Bob', '{"age": 25, "city": "Los Angeles"}');

-- 查詢 JSON 數(shù)據(jù)
SELECTname, JSON_EXTRACT(attributes, '$.city') AS city FROMusers;

二、JSON 是否違反第一范式?

在關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)中,第一范式(1NF)要求每個(gè)表的每個(gè)字段都包含原子性(不可再分)的值。這意味著每個(gè)字段只能存儲(chǔ)單一值,不能包含集合、數(shù)組或其他復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。MySQL 的 JSON 數(shù)據(jù)類型允許在一個(gè)字段中存儲(chǔ)復(fù)雜的嵌套數(shù)據(jù)結(jié)構(gòu),這在某些情況下可能違反 1NF,但在其他情況下又可能不違反。下面我們將分別舉例來(lái)說(shuō)明。

1. 違反第一范式

為了說(shuō)明 JSON違反1NF,這里以存儲(chǔ)多個(gè)電話號(hào)碼為例。假設(shè)我們有一個(gè) users 表,每個(gè)用戶可能有多個(gè)電話號(hào)碼。如果我們將所有電話號(hào)碼存儲(chǔ)在一個(gè) JSON 字段中,就違反了 1NF 的原子性要求。

CREATE TABLE users_conflict (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    phone_numbers JSON
);

INSERT INTO users_conflict (name, phone_numbers) VALUES 
('Alice', '["123-4567", "234-5678"]'),
('Bob', '["345-6789"]');

問(wèn)題分析:

  • 非原子性:phone_numbers 字段中包含了一個(gè)數(shù)組,存儲(chǔ)了多個(gè)電話號(hào)碼,違反了每個(gè)字段只能包含單一值的要求。
  • 數(shù)據(jù)冗余與一致性:查詢特定電話號(hào)碼或更新某個(gè)電話號(hào)碼變得復(fù)雜,且難以利用關(guān)系數(shù)據(jù)庫(kù)的約束(如唯一性)來(lái)保證數(shù)據(jù)的一致性。

當(dāng)我們要查詢所有包含電話號(hào)碼 "123-4567" 的用戶時(shí),SQL語(yǔ)句如下:

SELECT name
FROM users_conflict
WHERE JSON_CONTAINS(phone_numbers, '"123-4567"', '$');

雖然 MySQL 提供了 JSON 函數(shù),但這種查詢復(fù)雜度高于標(biāo)準(zhǔn)的關(guān)系型查詢,并且性能可能較低。

2. 不違反第一范式

為了說(shuō)明 JSON 不違反1NF,這里以存儲(chǔ)可選的、結(jié)構(gòu)化的屬性為例。假設(shè)我們有一個(gè) products 表,其中大部分產(chǎn)品都有固定的屬性(如 id、name、price),但某些產(chǎn)品可能有額外的可選屬性(如 dimensions、manufacturer_details)。這些可選屬性可以存儲(chǔ)在一個(gè) JSON 字段中,而不會(huì)違反 1NF。

CREATE TABLE products_no_conflict (
    idINT AUTO_INCREMENT PRIMARY KEY,
    nameVARCHAR(100),
    price DECIMAL(10,2),
    attributesJSON
);

INSERTINTO products_no_conflict (name, price, attributes) VALUES
('Laptop', 999.99, '{"dimensions": {"width": 35, "height": 2, "depth": 25}, "manufacturer_details": {"name": "TechCorp", "warranty": "2 years"}}'),
('Smartphone', 599.99, '{"color": "black", "storage": "128GB"}'),
('Book', 19.99, NULL);

問(wèn)題分析:

  • 維持原子性:attributes 字段用于存儲(chǔ)可選的、結(jié)構(gòu)化的額外信息。每個(gè) attributes 字段本身被視為一個(gè)單一的 JSON 值,符合 1NF 的原子性要求。
  • 數(shù)據(jù)靈活性:不需要為每種可能的屬性創(chuàng)建單獨(dú)的列,保持了表結(jié)構(gòu)的簡(jiǎn)潔性。
  • 查詢與維護(hù):盡管某些查詢可能需要使用 JSON 函數(shù),但由于這些屬性是附加的、可選的,不會(huì)影響表的主要結(jié)構(gòu)和核心數(shù)據(jù)的完整性。

當(dāng)我們要查詢所有寬度大于 30 的產(chǎn)品時(shí),SQL語(yǔ)句如下:

SELECT name, attributes
FROM products_no_conflict
WHERE JSON_EXTRACT(attributes, '$.dimensions.width') > 30;

雖然這種查詢依賴于 JSON 函數(shù),但由于 attributes 字段僅包含相關(guān)的附加信息,主表結(jié)構(gòu)依然保持了 1NF 的原子性。

三、總結(jié)

本文,我們分析了 MySQL 的 JSON 數(shù)據(jù)類型是否違反了數(shù)據(jù)庫(kù)的第一范式(1NF),通過(guò)全文的分析,我們可以知道:JSON 是否違反 1NF 取決于具體的應(yīng)用需求和數(shù)據(jù)模型設(shè)計(jì):

  • 與 1NF 沖突:當(dāng) JSON 字段用于存儲(chǔ)多值集合(如數(shù)組、重復(fù)組)時(shí),會(huì)違反 1NF 的原子性要求。例如,將多個(gè)電話號(hào)碼存儲(chǔ)在一個(gè) JSON 字段中。
  • 不與 1NF 沖突:當(dāng) JSON 字段用于存儲(chǔ)單一的結(jié)構(gòu)化對(duì)象,即使該對(duì)象內(nèi)部包含多個(gè)鍵值對(duì),也可以視為一個(gè)原子值,從而不違反 1NF。例如,存儲(chǔ)產(chǎn)品的可選屬性或配置信息。

需要注意的是,雖然在某些情況下使用 JSON 字段不會(huì)直接違反 1NF,但過(guò)度依賴 JSON 可能會(huì)帶來(lái)查詢復(fù)雜性、性能問(wèn)題和數(shù)據(jù)一致性維護(hù)的挑戰(zhàn)。因此,在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),應(yīng)權(quán)衡使用 JSON 字段的優(yōu)勢(shì)與潛在的規(guī)范化沖突,確保數(shù)據(jù)模型的可靠性和可維護(hù)性。

責(zé)任編輯:趙寧寧 來(lái)源: 猿java
相關(guān)推薦

2025-01-03 08:42:59

數(shù)據(jù)庫(kù)三范式架構(gòu)

2023-10-25 14:51:38

MySQL數(shù)據(jù)庫(kù)JSON

2020-06-09 08:09:07

機(jī)器學(xué)習(xí)統(tǒng)計(jì)學(xué)習(xí)無(wú)監(jiān)督學(xué)習(xí)

2025-03-20 09:13:26

2011-04-21 13:53:52

2009-03-23 10:11:59

Oracle數(shù)據(jù)庫(kù)唯一約束

2017-11-16 09:03:56

數(shù)據(jù)庫(kù)MySQLJSON

2021-02-25 10:16:22

比特幣貨幣虛擬貨幣

2024-02-19 14:58:34

編程范式開(kāi)發(fā)

2024-01-24 09:14:27

編程范式數(shù)據(jù)

2019-07-17 10:19:36

MySQL數(shù)據(jù)庫(kù)SQL

2016-09-26 17:48:35

戴爾

2023-02-27 23:45:09

MySQL索引存儲(chǔ)

2011-05-26 13:54:04

Json

2017-10-27 18:40:01

機(jī)器學(xué)習(xí)終身機(jī)器學(xué)習(xí)遷移學(xué)習(xí)

2024-08-27 10:54:20

JSON函數(shù)屬性

2023-09-14 23:14:57

MySQL索引

2021-08-27 06:34:04

開(kāi)源協(xié)議智能

2022-12-06 09:00:11

MySQL自增主鍵查詢

2009-10-15 17:51:25

MySQL索引類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)