mysql 商城商品属性开发的动态解决方案

news2025/4/13 11:29:31

终极方案:动态属性解决方案

推荐使用 JSON 字段 + 虚拟列索引 的组合方案
结合灵活存储与查询优化,平衡扩展性与性能


完整实现步骤

步骤 1:创建基础表结构
CREATE TABLE products (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  attributes JSON NOT NULL CHECK (JSON_VALID(attributes))  -- 强制验证JSON格式
);
步骤 2:插入动态属性数据
-- 插入带不同属性的产品
INSERT INTO products (name, price, attributes) VALUES
('T-Shirt', 29.99, '{"color": "red", "size": "XL"}'),         -- 两个属性
('Coffee Mug', 9.99, '{"material": "ceramic"}'),              -- 单个属性
('Phone Case', 14.99, '{"color": "black", "防摔等级": "IP68"}'); -- 中文属性名
步骤 3:动态查询技巧
-- 通用查询(所有属性包含特定值的商品)
SELECT * FROM products
WHERE JSON_CONTAINS(attributes, '"red"', '$')  -- 查询所有属性值包含'red'的商品

-- 精确属性查询(需知道属性名)
SELECT * FROM products
WHERE attributes->"$.color" = 'black'  -- 查询颜色为黑色的商品

-- 模糊属性名查询(不确定属性名时)
SELECT * FROM products
WHERE JSON_KEYS(attributes) LIKE '%防%'  -- 查找属性名包含"防"的商品
步骤 4:按需创建虚拟列索引
-- 为高频查询属性创建虚拟列
ALTER TABLE products
ADD COLUMN dynamic_color VARCHAR(30) 
    GENERATED ALWAYS AS (attributes->>"$.color") VIRTUAL,
ADD COLUMN dynamic_size VARCHAR(10) 
    GENERATED ALWAYS AS (attributes->>"$.size") VIRTUAL,
ADD INDEX idx_color (dynamic_color),
ADD INDEX idx_size (dynamic_size);

-- 混合查询示例(利用索引加速)
SELECT * FROM products
WHERE dynamic_color = 'red' AND price BETWEEN 20 AND 30;

方案优势说明

特性实现方式优势说明
动态属性支持JSON 字段存储任意键值对无需预定义字段,支持中文/特殊符号属性名
查询性能优化虚拟列 + BTREE 索引对高频查询属性建立索引,速度媲美传统列
数据验证CHECK 约束 + JSON_VALID()确保存储的JSON格式合法
多语言支持直接存储UTF-8字符完美支持中文属性名(如"防摔等级")
扩展性随时新增属性无需修改表结构适应业务快速变化需求

高级用法示例

1. 数据类型自动转换
-- 存储数值型属性
UPDATE products 
SET attributes = JSON_SET(attributes, '$.weight', '3.5')
WHERE id = 1;

-- 查询时转换类型
SELECT name, 
       CAST(attributes->>"$.weight" AS DECIMAL(3,1)) AS weight_kg
FROM products
WHERE attributes->>"$.weight" IS NOT NULL;
2. 动态属性统计
-- 统计所有出现过的属性名及其使用次数
SELECT attr_key, COUNT(*) AS usage_count
FROM products, 
     JSON_TABLE(JSON_KEYS(attributes), '$[*]' COLUMNS (attr_key VARCHAR(50) PATH '$')) AS jt
GROUP BY attr_key
ORDER BY usage_count DESC;

-- 结果示例:
-- attr_key      | usage_count
-- ----------------------------
-- color         | 2
-- size          | 1
-- material      | 1
-- 防摔等级       | 1
3. 动态属性搜索
-- 创建全文索引(MySQL 8.0+)
ALTER TABLE products
ADD COLUMN attributes_text TEXT 
    GENERATED ALWAYS AS (JSON_UNQUOTE(attributes)) VIRTUAL,
ADD FULLTEXT INDEX ft_attributes (attributes_text);

-- 全文检索示例
SELECT * FROM products
WHERE MATCH(attributes_text) AGAINST('+red -cotton' IN BOOLEAN MODE);

避坑指南

  1. 数据验证策略

    -- 强制必须包含至少一个属性
    ALTER TABLE products
    ADD CONSTRAINT chk_min_attributes 
    CHECK (JSON_LENGTH(attributes) >= 1);
    
    -- 应用层验证示例(Python伪代码)
    def validate_attributes(attrs):
        if not isinstance(attrs, dict):
            raise ValueError("Attributes must be a dictionary")
        if len(attrs) == 0:
            raise ValueError("At least one attribute required")
        for k, v in attrs.items():
            if not isinstance(k, str) or len(k) > 50:
                raise ValueError("Attribute name invalid")
    
  2. 性能优化建议

    • 为查询频率超过30%的属性创建虚拟列索引
    • 使用 JSON_COMPACT() 存储节省空间
    • 定期执行 OPTIMIZE TABLE 维护JSON字段
  3. 版本兼容方案

    -- MySQL 5.6兼容方案(使用TEXT代替JSON)
    CREATE TABLE legacy_products (
      id INT PRIMARY KEY AUTO_INCREMENT,
      attributes TEXT,
      CHECK (
        attributes REGEXP '^\{.*\}$'  -- 简单验证JSON格式
      )
    );
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蔚来汽车智能座舱接入通义大模型,并使用通义灵码全面提效

为加速AI应用在企业市场落地,4月9日,阿里云在北京召开AI势能大会。阿里云智能集团资深副总裁、公共云事业部总裁刘伟光发表主题演讲,大模型的社会价值正在企业市场释放,阿里云将坚定投入,打造全栈领先的技术&#xff0…

VMWare Workstation Pro17.6最新版虚拟机详细安装教程(附安装包教程)

目录 前言 一、VMWare虚拟机下载 二、VMWare虚拟机安装 三、运行虚拟机 前言 VMware 是全球领先的虚拟化技术与云计算解决方案提供商,通过软件模拟计算机硬件环境,允许用户在一台物理设备上运行多个独立的虚拟操作系统或应用。其核心技术可提升硬件…

【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)

一.什么是红黑树 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。1972年出现,最初被称为平衡二叉B树。1978年更名为“红黑树”。是一种特殊的二叉查找树,红黑树的每一个节点上都有存储表示节点的颜色。每一个节点可以是…

uni-app初学

文章目录 1. pages.json 页面路由2. 图标3. 全局 CSS4. 首页4.1 整体框架4.2 完整代码4.3 轮播图 swiper4.3.1 image 4.4 公告4.4.1 uni-icons 4.5 分类 uni-row、uni-col4.6 商品列表 uni-row、uni-col 小程序开发网址: 注册小程序账号 微信开发者工具下载 uniapp …

PHP多维数组

在 PHP 中&#xff0c;多维数组是数组的数组&#xff0c;允许你存储和处理更复杂的数据结构。多维数组可以有任意数量的维度&#xff0c;但通常我们最常用的是二维数组&#xff08;数组中的数组&#xff09;。 首先来介绍一下一维数组&#xff0c; <?php//一维数组 $strAr…

数学建模:针对汽车行驶工况构建思路的延伸应用

前言&#xff1a; 汽车行驶工况构建的思简单理解为将采集的大量数据进行“去除干扰、数据处理&#xff0c;缩减至1800S的数据”&#xff0c;并可达到等效替换的目的&#xff0c;可以使在试验室快速复现&#xff1b;相应的解决思路、办法可应用在 “通过能量流采集设备大量采集…

go语言内存泄漏的常见形式

go语言内存泄漏 子字符串导致的内存泄漏 使用自动垃圾回收的语言进行编程时&#xff0c;通常我们无需担心内存泄漏的问题&#xff0c;因为运行时会定期回收未使用的内存。但是如果你以为这样就完事大吉了&#xff0c;哪里就大错特措了。 因为&#xff0c;虽然go中并未对字符串…

当DRAM邂逅SSD:新型“DRAM+”存储技术来了!

在当今快速发展的科技领域&#xff0c;数据存储的需求日益增长&#xff0c;对存储设备的性能和可靠性提出了更高的要求。传统DRAM以其高速度著称&#xff0c;但其易失性限制了应用范围&#xff1b;而固态硬盘SSD虽然提供非易失性存储&#xff0c;但在速度上远不及DRAM。 为了解…

JS实现文件点击或者拖拽上传

B站看到了渡一大师课的切片&#xff0c;自己实现了一下&#xff0c;做下记录 效果展示 分为上传前、上传中和上传后 实现 分为两步 界面交互网络请求 源码如下 upload.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset&q…

Centos7.9 升级内核,安装RTX5880驱动

系统镜像下载 https://vault.centos.org/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 系统安装步骤省略 开始安装显卡驱动 远程登录查看内核 [root192 ~]# uname -a Linux 192.168.119.166 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x8…

Xdocreport实现根据模板导出word

只使用freemaker生成简单的word文档很容易&#xff0c;但是当word文档需要插入动态图片&#xff0c;带循环数据&#xff0c;且含有富文本时解决起来相对比较复杂&#xff0c;但是使用Xdocreport可以轻易解决。 Xdocreport既可以实现文档填充也可以实现文档转换&#xff0c;此处…

当当平台商品详情接口设计与调用指南

当当平台商品详情接口设计与调用指南 接口名称 GET /api/product/detail 图书商品核心信息查询接口 请求参数说明 参数名称 类型 是否必填 说明 isbn string 是 国际标准书号(支持13位/10位) product_id string 否 平台内部商品编号&#xff08;与…

sql server分析表大小

使用自动存储过程查询 EXEC sp_spaceused YourTableName; rows&#xff1a;表中的行数。reserved&#xff1a;表占用的总空间&#xff08;包括数据和索引&#xff09;。data&#xff1a;表数据占用的空间。index_size&#xff1a;索引占用的空间。unused&#xff1a;未使用的空…

《AI大模型应知应会100篇》第13篇:大模型评测标准:如何判断一个模型的优劣

第13篇&#xff1a;大模型评测标准&#xff1a;如何判断一个模型的优劣 摘要 近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;在自然语言处理、代码生成、多模态任务等领域取得了显著进展。然而&#xff0c;随着模型数量和规模的增长&#xff0c;如何科学评估这些模…

【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)

文章目录 私有数据访问私有数据实例存储槽Solidity 中的数据存储方式1. storage(持久化存储)定长数组变长数组2. memory(临时内存)3. calldata可见性关键字私有数据存储风险安全措施私有数据 私有数据(Private Data)通常指的是只对特定主体可见或可访问的数据,在区块链…

项目管理(高软56)

系列文章目录 项目管理 文章目录 系列文章目录前言一、进度管理二、配置管理三、质量四、风险管理五、真题总结 前言 本节主要讲项目管理知识&#xff0c;这些知识听的有点意思啊。对于技术人想创业&#xff0c;单干的都很有必要听听。 一、进度管理 二、配置管理 三、质量 四…

OpenCV边缘检测方法详解

文章目录 引言一、边缘检测基础概念边缘类型 二、OpenCV中的边缘检测方法1. Sobel算子2. Scharr算子3. Laplacian算子4. Canny边缘检测 三、性能比较与选择建议四、总结 引言 边缘检测是计算机视觉和图像处理中的基础技术&#xff0c;它能有效识别图像中物体的边界&#xff0c…

Linux:shell运行原理+权限

1.shell的运行原理 如果我们打开了命令终端或者是xshell进行远程登录服务器&#xff0c;就会看到命令行&#xff0c;如下图所示&#xff1a; 这个命令行本身也是系统中一个运行起来的程序&#xff0c;它用来接收用户的输入&#xff0c;帮用户来执行指令&#xff0c;将运行结果展…

【LeetCode Solutions】LeetCode 160 ~ 165 题解

CONTENTS LeetCode 160. 相交链表&#xff08;简单&#xff09;LeetCode 162. 寻找峰值&#xff08;中等&#xff09;LeetCode 164. 最大间距&#xff08;中等&#xff09;LeetCode 165. 比较版本号&#xff08;中等&#xff09; LeetCode 160. 相交链表&#xff08;简单&#…

Openssl升级至openssl9.8p1含全部踩坑内容

1、安装依赖包基础条件 yum install gcc yum install gcc-c yum install perl yum install perl-IPC-Cmd yum install pam yum install pam-devel sudo yum install perl-Data-Dumper 问题一&#xff1a;提示yum不可用 镜像源问题更换阿里源即可 wget -O /etc/yum.repos.d/…