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.mzph.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 模型的“使用方式”,包括文本分类、问答、摘要等相当于一个“…