數據庫優化提速(三)JSON數據類型在酒店管理系統搜索—仙盟創夢IDE

在 MySQL 中,JSONB?類型(MySQL 中實際為?JSON?類型,功能類似 PostgreSQL 的?JSONB,支持高效的 JSON 數據存儲和查詢)非常適合存儲半結構化數據,例如酒店入住客人的復雜信息(包含客人基本信息、入住記錄、附加服務等)。

下面以酒店入住客人信息為例,講解如何設計?JSON?類型字段的表結構,以及如何進行查詢操作。

一、設計含 JSON 字段的表結構

假設我們需要存儲客人的基礎信息(姓名、身份證等)和動態入住記錄(多次入住的詳情),可以設計一張表?hotel_guests,其中包含一個?JSON?類型的字段?guest_data?存儲核心信息:

sql

CREATE TABLE hotel_guests (id INT PRIMARY KEY AUTO_INCREMENT,  -- 自增ID(唯一標識)guest_data JSON NOT NULL,  -- JSON類型字段,存儲客人所有信息create_time DATETIME DEFAULT CURRENT_TIMESTAMP  -- 記錄創建時間
);

guest_data?字段的 JSON 結構示例(包含嵌套和數組):

json

{"basic_info": {"name": "張三","id_card": "110101199001011234","phone": "13800138001","gender": "男"},"check_in_records": [  -- 數組:存儲多次入住記錄{"order_id": "ORD20240501001","room_number": "101","check_in_date": "2024-05-01 14:30:00","check_out_date": "2024-05-03 12:00:00","room_type": "豪華單間","total_price": 800.00,"services": ["早餐", "洗衣服務"]  -- 附加服務},{"order_id": "ORD20240610002","room_number": "202","check_in_date": "2024-06-10 15:00:00","check_out_date": "2024-06-12 11:00:00","room_type": "雙床房","total_price": 600.00,"services": ["早餐"]}]
}

二、插入測試數據

向表中插入 3 條含 JSON 數據的記錄(模擬 3 位客人的信息):

sql

INSERT INTO hotel_guests (guest_data) VALUES
-- 客人1:張三(2次入住記錄)
('{"basic_info": {"name": "張三","id_card": "110101199001011234","phone": "13800138001","gender": "男"},"check_in_records": [{"order_id": "ORD20240501001","room_number": "101","check_in_date": "2024-05-01 14:30:00","check_out_date": "2024-05-03 12:00:00","room_type": "豪華單間","total_price": 800.00,"services": ["早餐", "洗衣服務"]},{"order_id": "ORD20240610002","room_number": "202","check_in_date": "2024-06-10 15:00:00","check_out_date": "2024-06-12 11:00:00","room_type": "雙床房","total_price": 600.00,"services": ["早餐"]}]
}'),-- 客人2:李四(1次入住,未退房)
('{"basic_info": {"name": "李四","id_card": "310101199505055678","phone": "13900139002","gender": "女"},"check_in_records": [{"order_id": "ORD20240502003","room_number": "301","check_in_date": "2024-05-02 16:00:00","check_out_date": null,"room_type": "行政套房","total_price": 1200.00,"services": ["接機服務", "早餐"]}]
}'),-- 客人3:王五(1次入住,含特殊需求)
('{"basic_info": {"name": "王五","id_card": "440101200010109012","phone": "13700137003","gender": "男"},"check_in_records": [{"order_id": "ORD20240504004","room_number": "101","check_in_date": "2024-05-04 10:00:00","check_out_date": "2024-05-06 11:30:00","room_type": "豪華單間","total_price": 800.00,"services": ["早餐"],"special_request": "需要嬰兒床"  -- 額外的動態字段}]
}');

三、基于 JSON 字段的查詢案例

MySQL 提供了豐富的 JSON 函數(如?->->>JSON_EXTRACTJSON_CONTAINS?等),用于查詢 JSON 字段中的數據。以下是酒店場景中的常見查詢需求:

案例 1:查詢所有客人的姓名和電話(提取 JSON 中的基礎字段)

需求:快速獲取客人的姓名和聯系方式,用于前臺溝通。
核心語法:->>?用于提取 JSON 字段并轉為字符串(->?提取為 JSON 格式)。

sql

SELECT-- 提取 basic_info 中的 name 和 phone(->> 轉為字符串)guest_data->>'$.basic_info.name' AS 客人姓名,guest_data->>'$.basic_info.phone' AS 聯系電話,guest_data->>'$.basic_info.gender' AS 性別
FROM hotel_guests;-- 結果:
-- 客人姓名 | 聯系電話    | 性別
-- 張三     | 13800138001 | 男
-- 李四     | 13900139002 | 女
-- 王五     | 13700137003 | 男
案例 2:查詢 “張三” 的所有入住記錄(按 JSON 字段篩選)

需求:根據客人姓名查詢其所有入住詳情(訂單號、房間號、價格等)。
核心語法:JSON_EXTRACT?提取字段,結合?WHERE?條件篩選。

sql

SELECTguest_data->>'$.basic_info.name' AS 客人姓名,-- 提取 check_in_records 數組(保留 JSON 格式)guest_data->'$.check_in_records' AS 入住記錄
FROM hotel_guests
-- 條件:姓名為“張三”(注意字符串需用單引號)
WHERE guest_data->>'$.basic_info.name' = '張三';-- 結果:
-- 客人姓名 | 入住記錄(JSON數組,包含2條訂單)
-- 張三     | [{"order_id": "ORD20240501001", ...}, {...}]
案例 3:查詢所有 “豪華單間” 的入住記錄(篩選 JSON 數組中的元素)

需求:統計所有入住過 “豪華單間” 的客人及訂單信息。
核心語法:JSON_CONTAINS?判斷數組中是否包含滿足條件的元素,JSON_TABLE?解析 JSON 數組為行(MySQL 8.0+ 支持)。

sql

-- 方法1:判斷是否有豪華單間的入住記錄(返回整行)
SELECTguest_data->>'$.basic_info.name' AS 客人姓名,guest_data->>'$.check_in_records[*].order_id' AS 相關訂單號
FROM hotel_guests
-- 條件:check_in_records 數組中存在 room_type = "豪華單間" 的元素
WHERE JSON_CONTAINS(guest_data->'$.check_in_records','{"room_type": "豪華單間"}','$'
);-- 結果:張三(1次)和王五(1次)住過豪華單間
-- 客人姓名 | 相關訂單號
-- 張三     | ["ORD20240501001", "ORD20240610002"]
-- 王五     | ["ORD20240504004"]-- 方法2:用 JSON_TABLE 解析數組為行(更清晰展示每條訂單)
SELECTjt.order_id AS 訂單號,g.guest_data->>'$.basic_info.name' AS 客人姓名,jt.room_type AS 房間類型,jt.total_price AS 總金額
FROM hotel_guests g,
-- 將 check_in_records 數組解析為多行
JSON_TABLE(g.guest_data->'$.check_in_records','$[*]' COLUMNS (order_id VARCHAR(20) PATH '$.order_id',room_type VARCHAR(30) PATH '$.room_type',total_price DECIMAL(10,2) PATH '$.total_price')
) AS jt
-- 篩選房間類型為豪華單間
WHERE jt.room_type = '豪華單間';-- 結果:
-- 訂單號         | 客人姓名 | 房間類型 | 總金額
-- ORD20240501001 | 張三     | 豪華單間 | 800.00
-- ORD20240504004 | 王五     | 豪華單間 | 800.00
案例 4:查詢 “未退房” 的客人(篩選 JSON 中的 NULL 值)

需求:前臺需要確認當前在店客人(check_out_date?為?null)。
核心語法:JSON_SEARCH?查找 NULL 值的路徑,結合?IS NOT NULL?判斷。

sql

SELECTguest_data->>'$.basic_info.name' AS 客人姓名,guest_data->>'$.check_in_records[*].room_number' AS 房間號,guest_data->>'$.check_in_records[*].check_in_date' AS 入住時間
FROM hotel_guests
-- 條件:存在 check_out_date 為 null 的入住記錄
WHERE JSON_SEARCH(guest_data,'one',  -- 查找第一個匹配項NULL,   -- 匹配 NULL 值'$',    -- 從根路徑開始'$.check_in_records[*].check_out_date'  -- 匹配的路徑
) IS NOT NULL;-- 結果:僅李四未退房
-- 客人姓名 | 房間號   | 入住時間
-- 李四     | ["301"] | ["2024-05-02 16:00:00"]
案例 5:統計 “2024 年 5 月” 的總營收(聚合 JSON 中的數值)

需求:財務統計 5 月所有訂單的總金額。
核心語法:JSON_TABLE?解析數組為行,結合日期函數和?SUM()?聚合。

sql

SELECTSUM(jt.total_price) AS '2024年5月總營收'
FROM hotel_guests g,
JSON_TABLE(g.guest_data->'$.check_in_records','$[*]' COLUMNS (check_in_date DATETIME PATH '$.check_in_date',total_price DECIMAL(10,2) PATH '$.total_price')
) AS jt
-- 篩選入住時間在2024年5月的訂單
WHERE DATE_FORMAT(jt.check_in_date, '%Y-%m') = '2024-05';-- 結果:
-- 2024年5月總營收
-- 2800.00 (張三800 + 李四1200 + 王五800)
案例 6:查詢有 “特殊需求” 的客人(動態字段查詢)

需求:篩選有特殊要求(如需要嬰兒床)的客人,便于客房準備。
核心語法:直接查詢 JSON 中可能存在的動態字段(無需預先定義表結構)。

sql

SELECTguest_data->>'$.basic_info.name' AS 客人姓名,guest_data->>'$.check_in_records[*].special_request' AS 特殊需求
FROM hotel_guests
-- 條件:存在 special_request 字段且不為空
WHERE guest_data->>'$.check_in_records[*].special_request' IS NOT NULL;-- 結果:
-- 客人姓名 | 特殊需求
-- 王五     | ["需要嬰兒床"]

四、JSON 類型的優勢與注意事項

  1. 優勢

    • 適合存儲半結構化數據(如客人的動態入住記錄、靈活的附加服務)。
    • 無需預先定義所有字段(如案例 6 中的?special_request?可動態添加)。
    • 支持嵌套和數組,能更自然地表達復雜關系(如一個客人對應多個入住記錄)。
  2. 注意事項

    • 復雜查詢(如案例 3)需要結合?JSON_TABLE?等函數,語法較關系型查詢更復雜。
    • 索引優化有限(MySQL 支持 JSON 字段的部分索引,但效率不如傳統字段)。
    • 不適合頻繁更新 JSON 中的某個字段(建議整體更新或用?JSON_SET?函數)。

通過上述案例可以看出,JSON?類型在處理酒店客人這類包含動態、復雜信息的數據時非常靈活,尤其適合需要快速擴展字段或存儲數組 / 嵌套結構的場景。

阿雪技術觀

在科技發展浪潮中,我們不妨積極投身技術共享。不滿足于做受益者,更要主動擔當貢獻者。無論是分享代碼、撰寫技術博客,還是參與開源項目維護改進,每一個微小舉動都可能蘊含推動技術進步的巨大能量。東方仙盟是匯聚力量的天地,我們攜手在此探索硅基生命,為科技進步添磚加瓦。

Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets, hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94205.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94205.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序全局狀態管理:使用MobX進行跨組件數據共享詳解(九)

一、定義全局數據共享(又叫:狀態管理)是為了解決組件之間數據共享的問題;全局數據共享方案:VueX、Redux、MobX等;二、小程序全局數據共享方案使用mobx-miniprogram配合mobx-miniprogram-bindings實現全局數…

生成模型 | DDPM -> Imrpoved DDPM -> DDIM

DDPM: Denoising Diffusion Probabilistic Models 采樣過程中的迭代計算為: xt?11αt(xt?1?αt1?αˉ?θ(xt,t))β~tzx_{t-1} \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}}}\epsilon_{\theta}(x_t, t)) \sqrt{\tilde{\beta…

Linux驅動之DMA(三)

目錄一、驅動內容1. 核心結構體解析2. 關鍵模塊解析3. 驅動初始化流程4. 關鍵寄存器操作5. 典型工作流程6. 代碼特點7. 重要函數列表8. 使用示例二、驅動中DMA的使用1. DMA通道初始化(imx_uart_dma_init)2. DMA發送流程(imx_uart_dma_tx&…

MongoDB 分片集群把非分片集合轉成分片集合

記得關注一下博主,博主每天都會更新IT技術,讓你有意想不到的小收獲哦^_^ 文章目錄*記得關注一下博主,博主每天都會更新IT技術,讓你有意想不到的小收獲哦^_^*一、MongDB集群啟停止1、MonogoDB分片集群服務啟動順序(三臺主機都要操作…

mybatis過渡到mybatis-plus過程中需要注意的地方

將 MyBatis 升級為 MyBatis-Plus(簡稱 MP)是一個平滑過渡的過程,因為 MP 是 MyBatis 的增強工具(而非替代),但仍有一些關鍵注意事項需要關注,以確保升級后功能兼容且能充分利用 MP 的特性&#…

openEuler系統中如何將docker安裝在指定目錄

在 openEuler 中,Docker 的默認數據存儲目錄為 /var/lib/docker(程序文件通常安裝在系統默認路徑,一般無需修改)。若需將 Docker 數據(鏡像、容器、卷等)存儲到指定目錄,可通過修改 Docker 配置…

2.4 我國金融市場的監管體制

1、國務院金融發展委員會職責 2、中國人民銀行職責

PHP - 實例屬性訪問與靜態方法調用的性能差異解析

觀察到了一個看似矛盾的現象:實例屬性訪問更快,但靜態方法調用更快。這實際上是兩種不同的操作,下面我將詳細解釋其中的原理和差異。1. 實例屬性訪問為什么快訪問機制class MyClass {public $instanceProp 1; }$obj new MyClass(); $value …

音視頻面試題集錦第 31 期

音視頻面試題集錦第 31 期: 1、I 幀、P 幀和 B 幀的概念及區別?2、視頻編碼中的碼率控制技術有哪些?3、音頻采樣參數有哪些?4、RTMP 和 HLS 協議各有什么特點?如何選擇?5、WebRTC 中的 ICE、STUN、TURN 各…

企業視頻庫管理高效策略

內容概要本文全面探討企業視頻庫管理的高效策略,旨在幫助組織優化視頻資源處理。首先,我們將介紹企業視頻庫管理的基本概念和核心價值。接著,深入分析智能分類核心技術如何通過AI算法實現視頻自動歸類。之后,闡述云集成實現路徑&a…

WebSocket和跨域問題

WebSocket 特點 WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。簡單來說,它就像是在客戶端和服務器之間建立了一條"專用通道",雙方可以隨時主動發送消息給對方,而不需要像HTTP那樣總是由客戶端發起請求。 同一時間、雙向…

微服務-19.什么是網關

一.網關曾經我們的項目是單體項目,前端只需要請求8080端口,就可以獲取所有需要的數據和服務并進行渲染。但是拆分成微服務后,會面臨幾大問題:1.但是現在我們將該單體項目拆分成了微服務項目,每個項目都有自己獨立的端口…

從字節碼層面剖析以太坊智能合約創建原理

1. 引言 閱讀完本文之后,將能理解一下字節碼含義: 608060405260405160893803806089833981016040819052601e916025565b600055603d565b600060208284031215603657600080fd5b5051919050565b603f80604a6000396000f3fe6080604052600080fdfea2646970667358221…

typora無需激活版及最新激活版方法!雙擊安裝就能用

介紹 Typora 是一款Markdown編輯器,支持實時預覽,所見即所得。跨平臺,支持Windows、macOS、Linux。適合寫作、筆記、技術文檔等。本教程將提供合法安全的安裝方案,并解決常見問題,助你高效完成部署! 直接…

基于Java、GeoTools與PostGIS的對跖點求解研究

目錄 前言 一、對跖點簡介 1、地理學定義 2、人生哲學含義 二、對跖點求解 1、Java求解 2、Geotools求解 3、PostGIS求解 4、三種計算方法的對比 5、Leaflet展示對跖點 三、總結 前言 在地理信息系統(GIS)領域,對跖點(A…

Linux-函數的使用-編寫監控腳本

Linux-函數的使用-編寫監控腳本前言一、監控cpu二、采集內存的使用信息三、采集磁盤和分區的使用信息四、顯示進程的信息前言 編寫監控腳本實現以下功能 監控cpu,內存,磁盤,進程等信息,每隔5分鐘記錄這些信息到日志文件里perform…

Authelia:開源雙因素認證與單點登錄解決方案

項目標題與描述 Authelia是一個開源的認證和授權服務器,專注于為應用程序提供雙因素認證(2FA)和單點登錄(SSO)功能。通過Web門戶,Authelia能夠作為身份和訪問管理(IAM)系統&#xff…

Apache Ozone 介紹與部署使用(最新版2.0.0)

目錄 一、軟件介紹 二、軟件架構 Ozone Manager(OM) Storage Container Manager(SCM) Containers Datanodes Storage Containers Recon Recon 和 Ozone Manager Recon 和 Storage Container Manager 三、安裝部署 準備…

Review --- Linux

Review — Linux Linux 是一種開源的類 Unix 操作系統內核,廣泛應用于服務器、嵌入式設備和個人計算機中。其核心特點是開源、穩定、安全和高度的可定制性。對于大學畢業生而言,掌握 Linux 的基本操作和原理是進入 IT 行業的重要技能之一。 Linux 的基本…

【msyql 】占用硬盤太大 ,那些文件可以清理

從目錄內容來看,這臺 MySQL 服務器上主要是 xxl-job 調度平臺的數據庫。占用空間最大的是:24G xxl_job_log.ibd這個文件是 xxl-job 的任務執行日志表,隨著時間推移,日志量會非常大。可以清理的文件和方法1. 清理 xxl_job_log 表數…