MySQL 中為產品添加靈活的自定義屬性(如 color/size)


方案 1:EAV 模型(最靈活但較復雜)

適合需要無限擴展自定義屬性的場景

-- 產品表
CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DECIMAL(10,2)
);-- 屬性名表
CREATE TABLE attributes (id INT PRIMARY KEY AUTO_INCREMENT,attr_name VARCHAR(50) UNIQUE -- color/size 等
);-- 屬性值表
CREATE TABLE product_attributes (product_id INT,attribute_id INT,value VARCHAR(255),PRIMARY KEY (product_id, attribute_id),FOREIGN KEY (product_id) REFERENCES products(id),FOREIGN KEY (attribute_id) REFERENCES attributes(id)
);

優點

  • 無限擴展新屬性
  • 屬性可復用(如多個產品共用 color 屬性)
  • 便于統一管理屬性

缺點

  • 查詢復雜(需要多次 JOIN)
  • 難以對特定屬性建立索引
  • 值只能是字符串類型
  • 數據驗證需在應用層實現

方案 2:JSON 字段(MySQL 5.7+ 推薦)

適合屬性結構靈活變化的場景

CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DECIMAL(10,2),attributes JSON NOT NULL
);-- 插入示例
INSERT INTO products 
VALUES (1, 'T-Shirt', 29.99, '{"color": "red", "size": "XL", "material": "cotton"}');

查詢示例

-- 查詢特定顏色
SELECT * FROM products
WHERE JSON_EXTRACT(attributes, '$.color') = 'red';-- 查詢特定尺寸
SELECT * FROM products
WHERE attributes->"$.size" = 'XL';-- 創建虛擬列并建立索引(優化查詢)
ALTER TABLE products
ADD COLUMN color VARCHAR(30) 
GENERATED ALWAYS AS (attributes->>"$.color") VIRTUAL,
ADD INDEX (color);

優點

  • 靈活存儲任意結構
  • 避免多表關聯
  • 支持 JSON 路徑查詢
  • 可通過虛擬列建立索引

缺點

  • 需要 MySQL 5.7+
  • 數據類型驗證需在應用層處理
  • 復雜查詢效率較低

方案 3:關聯表方案(適合固定屬性)

適合已知且有限的常用屬性

-- 產品表
CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DECIMAL(10,2)
);-- 顏色表
CREATE TABLE product_colors (product_id INT PRIMARY KEY,color VARCHAR(50),FOREIGN KEY (product_id) REFERENCES products(id)
);-- 尺寸表
CREATE TABLE product_sizes (product_id INT PRIMARY KEY,size VARCHAR(20),FOREIGN KEY (product_id) REFERENCES products(id)
);

優點

  • 數據結構化
  • 查詢效率高
  • 可單獨建立索引
  • 支持強類型約束

缺點

  • 新增屬性需要修改表結構
  • 擴展性較差

推薦選擇建議:

  1. 優先推薦 JSON 方案(如果使用 MySQL 5.7+)

    • 現代應用常用方案
    • 平衡了靈活性和查詢效率
    • 結合虛擬列索引可解決性能問題
  2. 次選 EAV 模型(需要支持舊版本 MySQL)

    • 注意要控制屬性數量
    • 建議配合緩存使用
  3. 固定屬性方案(當屬性非常穩定時)

    • 適合明確知道需要 color/size 等固定屬性的場景

實際案例參考(JSON 方案):

-- 創建帶索引的優化表
CREATE TABLE optimized_products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),price DECIMAL(10,2),attributes JSON NOT NULL,-- 生成列color VARCHAR(30) GENERATED ALWAYS AS (attributes->>"$.color") VIRTUAL,size VARCHAR(10) GENERATED ALWAYS AS (attributes->>"$.size") VIRTUAL,-- 建立索引INDEX (color),INDEX (size)
);-- 查詢示例(可以直接使用虛擬列)
SELECT * FROM optimized_products 
WHERE color = 'blue' AND size = 'M';

注意事項

  1. 在應用層驗證數據格式(如確保 size 只能是預設值)
  2. 對高頻查詢的字段創建虛擬列+索引
  3. JSON 文檔大小不要超過 1MB
  4. 使用 JSON_VALID() 約束保證數據有效性:
ALTER TABLE products 
ADD CONSTRAINT validate_attributes 
CHECK (JSON_VALID(attributes));

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

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

相關文章

CSPM認證對項目論證的范式革新:從合規審查到價值創造的戰略躍遷

引言 在數字化轉型浪潮中,全球企業每年因項目論證缺陷導致的損失高達1.7萬億美元(Gartner 2023)。CSPM(Certified Strategic Project Manager)認證體系通過結構化方法論,將傳統的項目可行性評估升級為戰略…

CLIP中的Zero-Shot Learning原理

CLIP(Contrastive Language-Image Pretraining)是一種由OpenAI提出的多模態模型,它通過對比學習的方式同時學習圖像和文本的表示,并且能在多種任務中進行零樣本學習(Zero-Shot Learning)。CLIP模型的核心創…

spring mvc 中 RestTemplate 全面詳解及示例

RestTemplate 全面詳解及示例 1. RestTemplate 簡介 定義:Spring 提供的同步 HTTP 客戶端,支持多種 HTTP 方法(GET/POST/PUT/DELETE 等),用于調用 RESTful API。核心特性: 支持請求頭、請求體、URI 參數的…

北大:LLM在NL2SQL中任務分解

📖標題:LearNAT: Learning NL2SQL with AST-guided Task Decomposition for Large Language Models 🌐來源:arXiv, 2504.02327 🌟摘要 🔸自然語言到SQL(NL2SQL)已成為實現與數據庫…

STM32LL庫編程系列第八講——ADC模數轉換

系列文章目錄 往期文章 STM32LL庫編程系列第一講——Delay精準延時函數(詳細,適合新手) STM32LL庫編程系列第二講——藍牙USART串口通信(步驟詳細、原理清晰) STM32LL庫編程系列第三講——USARTDMA通信 STM32LL庫編程…

網絡5 TCP/IP 虛擬機橋接模式、NAT、僅主機模式

TCP/IP模型 用于局域網和廣域網;多個協議;每一層呼叫下一層;四層;通用標準 TCP/IP模型 OSI七層模型 應用層 應用層 表示層 會話層 傳輸層 傳輸層 網絡層 網絡層 鏈路層 數據鏈路層 物理層 鏈路層:傳數據幀&#xff0…

【C語言】預處理(下)(C語言完結篇)

一、#和## 1、#運算符 這里的#是一個運算符,整個運算符會將宏的參數轉換為字符串字面量,它僅可以出現在帶參數的宏的替換列表中,我們可以將其理解為字符串化。 我們先看下面的一段代碼: 第二個printf中是由兩個字符串組成的&am…

【高性能緩存Redis_中間件】一、快速上手redis緩存中間件

一、鋪墊 在當今的軟件開發領域,消息隊列扮演著至關重要的角色。它能夠幫助我們實現系統的異步處理、流量削峰以及系統解耦等功能,從而提升系統的性能和可維護性。Redis 作為一款高性能的鍵值對數據庫,不僅提供了豐富的數據結構,…

Java如何獲取文件的編碼格式?

Java獲取文件的編碼格式 在計算機中,文件編碼是指將文件內容轉換成二進制形式以便存儲和傳輸的過程。常見的文件編碼格式包括UTF-8、GBK等。不同的編碼使用不同的字符集和字節序列,因此在讀取文件時需要正確地確定文件的編碼格式 Java提供了多種方式以獲…

客戶端負載均衡與服務器端負載均衡詳解

客戶端負載均衡與服務器端負載均衡詳解 1. 客戶端負載均衡(Client-Side Load Balancing) 核心概念 定義:負載均衡邏輯在客戶端實現,客戶端主動選擇目標服務實例。典型場景:微服務內部調用(如Spring Cloud…

Quartus II的IP核調用及仿真測試

目錄 第一章 什么是IP核?第二章 什么是LPM?第一節 設置LPM_COUNTER模塊參數第二節 仿真 第三章 什么是PLL?第一節 設置ALTPLL(嵌入式鎖相環)模塊參數第二節 仿真 第四章 什么是RAM?第一節 RAM_1PORT的調用第…

各地物價和生活成本 東歐篇

東歐地區的物價差異相對較大,一些國家的物價較高,而另一些國家則相對便宜。這些差異主要受當地經濟發展水平、工資水平、旅游業發展以及國際關系等因素影響。以下是一些典型的東歐國家,按物價高低進行分類: 🌍 物價較高…

改進神經風格遷移

改進神經風格遷移(Neural Style Transfer, NST)可以從多個方向入手,包括模型結構優化、損失函數設計、計算效率提升、應用場景擴展等。以下是一些關鍵的改進方向及具體方法: 1. 模型結構優化 (1)輕量化網絡…

1、從零搭建魔法工坊:React 19 新手村生存指南

一、開篇:新世界的入場券 "你好,年輕的魔法學徒!歡迎來到React魔法世界。我是你的向導赫敏韋斯萊,今天我們將用React 19這根全新魔杖,搭建屬于你的第一座魔法工坊。" ——以對話形式開場,消除技…

基于 Redis 實現一套動態配置中心 DCC 服務與反射基礎知識講解

目錄 動態配置中心核心價值 輕量級 Redis 方案與 ZooKeeper 的對比分析 為什么選擇自定義 Redis 方案? 1. 技術決策背景 一、活動降級攔截 1. 定義與作用 2. 實現原理 二、活動切量攔截 1. 定義與作用 2. 實現原理 三、兩者的核心區別 四、實際應用案例 1. 電商大促…

如何從項目目標到成功標準:構建可量化、可落地的項目評估體系

引言 在項目管理領域,"項目成功"的定義往往比表面看起來更復雜。根據PMI的行業報告,67%的項目失敗源于目標與成功標準的不匹配。當項目團隊僅關注"按時交付"或"預算達標"時,常會忽視真正的價值創造。本文將通…

深度學習基礎--CNN經典網絡之分組卷積與ResNext網絡實驗探究(pytorch復現)

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 前言 ResNext是分組卷積的開始之作,這里本文將學習ResNext網絡;本文復現了ResNext50神經網絡,并用其進行了猴痘病分類實驗…

SQL 全文檢索原理

全文檢索(Full-Text Search)是SQL中用于高效搜索文本數據的技術,與傳統的LIKE操作或簡單字符串比較相比,它能提供更強大、更靈活的文本搜索能力。 基本概念 全文檢索的核心思想是將文本內容分解為可索引的單元(通常是詞或詞組),然后建立倒排…

【Linux】Orin NX編譯 linux 內核及內核模塊

1、下載交叉編譯工具:gcc 1)下載地址:https://developer.nvidia.com/embedded/jetson-linux 選擇TOOLS中的交叉編譯工具:gcc 11.3 2)解壓 將gcc編譯器解壓到指定目錄中,如:/home/laoer/nvidia/gcc 3)配置環境變量 創建: ~/nvidia/gcc/env.sh添加: #!/bin/bash e…

Transformers 是工具箱,BERT 是工具。

Transformers 是工具箱,BERT 是工具。 🔍 詳細解釋: 名稱作用比喻理解舉例🤖 transformers(庫)一個框架,提供很多 NLP 模型的“使用方式”,包括文本分類、問答、摘要等相當于一個“…