Mysql以key-val存储、正常存储的区别

场景

你作为一个服务端工程师,假设产品要求设计这么一个页面,页面上包含很多模块,每个模块都可以单独进行变更,有些模块是富文本。

在这里插入图片描述

实现方式有很多,我们来聊比较常用的两种,看看mysql的表如何设计。

第一种使用key-val的方案,这就需要两张表。

CREATE TABLE `playground` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`name` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',`operator_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '操作人id',`status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '状态,1使用 2删除',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_operator_id` (`operator_id`),KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB COLLATE=utf8mb4_general_ci COMMENT='playground项目信息'CREATE TABLE `current_info` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`playground_id` bigint unsigned NOT NULL COMMENT 'playground_id',`item_type` int NOT NULL DEFAULT '0' COMMENT '每个模块的id',`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '模块内容',`operator_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '操作人id',`status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '状态,1使用 2删除',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_playground_id` (`playground_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='当前信息'

第二种方式则是放在一张表记录

CREATE TABLE `current_info` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',`description` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '描述',`status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '状态,0无效,1有效',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`creator_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '创建者ID',`a` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'a模块内容',`b` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'b模块内容',PRIMARY KEY (`id`),KEY `idx_creator_id` (`creator_id`),KEY `idx_create_time` (`create_time`),KEY `idx_update_time` (`update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='内容表'

对于这两种方案,你会如何选择?

对比

我个人建议选择正常存储的方案,因为适应面更加广泛

Key-val正常存储
优点增加新模块,服务端无需感知,前端自行增加即可实现复杂度低很多
缺点1. 即使是普通的列表,实现起来也比较复杂,必须有一张主表 2.列表排序、筛选不好实现,如按照修改时间排序、根据名称筛选等 3.数量多,页面数据会有多条 4.字段浪费严重,每个字段必须一样,大部分情况是是text每次有新增模块,服务端需要一起修改。但这个比较正常,大部分时候新增的功能,服务端总是需要做一些改动的

总结

对于技术方案的选择,十分重要,尤其是作为第一版的设计者。怎么知道哪个方案更加合适呢?我的想法是找到当前的各个场景和预判将来的各个场景,思考一下如果用某套方案实现这些场景,成本如何。

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

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

相关文章

巧用@Conditional注解根据配置文件注入不同的bean对象

项目中使用了mq,kafka两种消息队列进行发送数据,为了避免硬编码,在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案,仅供参考! 方案一:创建一个工具类,然后根据配置文…

一个案例熟悉使用pytorch

文章目录 1. 完整模型的训练套路1.2 导入必要的包1.3 准备数据集1.3.1 使用公开数据集:1.3.2 获取训练集、测试集长度:1.3.3 利用 DataLoader来加载数据集 1.4 搭建神经网络1.4.1 测试搭建的模型1.4.2 创建用于训练的模型 1.5 定义损失函数和优化器1.6 使…

【Stm32-F407】Keil uVision5 的安装

文章内容如下: 1)Keil uVision5 安装包的获取2)Keil uVision5 的安装3)Keil uVision5 中 Stm32-F407 芯片包的获取与安装4)注册 Keil uVision5 1)Keil uVision5 安装包的获取 Keil uVision5 安装包链接: h…

华硕平板k013me176cx线刷方法

1.下载adb刷机工具, 或者刷机精灵 2.下载刷机rom包 华硕asus k013 me176cx rom固件刷机包-CSDN博客 3.平板进入刷机界面 进入方法参考: ASUS (k013) ME176CX不进入系统恢复出厂设置的方法-CSDN博客 4.解压ME176C-CN-3_2_23_182.zip,把UL-K013-CN-3.2.…

java图书信息管理

一、项目概述 本图书信息管理系统旨在提供一个直观的用户界面,用于管理图书馆或书店的图书信息。系统包括图书添加、查询、借阅和归还等功能。 二、系统架构 系统采用JavaSwing作为前端UI框架,后端使用Java Servlet处理业务逻辑,数据存储在…

一键智能视频编辑与视频修复算法——ProPainter源码解析与部署

前言 视频编辑和修复确实是随着电子产品的普及变得越来越重要的技能。有许多视频编辑工具可以帮助人们轻松完成这些任务如:Adobe Premiere Pro,Final Cut Pro X,Davinci Resolve,HitFilm Express,它们都提供一些视频修…

ipaguard界面概览

ipaguard界面分左右2块:左边菜单导航栏,右边的功能区 左侧菜单:按模块分成启动界面,代码模块,文件模块,重签名与测试模块 右侧主功能区会随着功能变化,但是整体分3块,顶部显示过滤区…

数据指标体系

一、初识指标体系构建 1.1 什么是指标体系 指标体系是一个比较抽象的概念,指标体系是衡量、评估和监测特定领域或目标的系统化指标的集合。它由多个指标组成,这些指标可以用于衡量和评估所关注领域或目标的各个方面。指标体系通常被用于监测和评估业务绩…

柯桥生活口语学习,英语中初次见面,除了Nice to meet you,还能说什么?

第一印象非常重要。所以当你第一次见到某人时,留下一个好印象很重要,尤其是当你面对一个重要的工作或者面对某个对你来说可能非常特别的人时。 下面我列出了一些最常用的说“很高兴见到你”的表达方法,也包括对方的回答,除了nice …

Kaggle - LLM Science Exam上:赛事概述、数据收集、BERT Baseline

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、BERT Baseline2.1 数据预处理2.2 定义data_collator2.3 加载模型,配置trainer并训练2.4 预测结果并提交2.5 相关优化 前言:国庆期间…

用于数据增强的十个Python库

数据增强是人工智能和机器学习领域的一项关键技术。它涉及到创建现有数据集的变体,提高模型性能和泛化。Python是一种流行的AI和ML语言,它提供了几个强大的数据增强库。在本文中,我们将介绍数据增强的十个Python库,并为每个库提供…

springmvc-国际化中英文切换文件上传下载

1. 国际化 1.1 介绍 国际化(internationalization), 简称国际化。一个产品支持国际化是指产品在无需做大的改变就能够适应不同的语言和地区的能力。i18n是指是一种让软件在开发阶段就支持多种语言的技术。 1.2 java.util.Locale 该类对象表示了特定的地理&#…

GET 和 POST的区别

GET 和 POST 是 HTTP 请求的两种基本方法,要说它们的区别,接触过 WEB 开发的人都能说出一二。 最直观的区别就是 GET 把参数包含在 URL 中,POST 通过 request body 传递参数。 你可能自己写过无数个 GET 和 POST 请求,或者已经看…

【Leetcode】 131. 分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s "aab" 输出:[["a","a"…

java Spring Boot 手动启动热部署

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂,重启是一件非常麻烦的事 或者你在和前端同事联调,有一点小问题 你改完就要重启 前端还得等你,非常不友好 那…

docker基础命令

目录 一、安装docker 1、查看是否已安装docker 2、如果系统中已经存在旧的Docker 3、配置Docker的yum库 4、安装成功后,执行命令,配置Docker的yum源 5、安装Docker 6、启动和校验 7、配置镜像加速器,阿里云镜像加速为例 7.1、在首页的…

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案_已设置图床

minikube如何设置阿里云镜像以及如何解决dashboard无法打开的解决方案 minikube dashboard报错 considerconsider-Dell-G15-5511:~$ minikube dashboard 🤔 正在验证 dashboard 运行情况 ... 🚀 正在启动代理... 🤔 正在验证 proxy 运行…

RDP协议流程详解(一)Connection Initiation阶段

Connetction Initiation是RDP连接的第一个阶段,具体包含两个消息RDP Negotiation Request和RDP Negotiation Response,下面结合协议数据包详细分析。 (1)RDP Negotiation Request 从数据包可以清晰看到此时的协议栈依次是TCP-TPKT…

swift加载h5页面空白

swift加载h5页面空白 problem 背景 xcode swift 项目,WebView方式加载h5页面本地h5地址是:http://localhost:5173/ 浏览器打开正常 Swift 加载h5: 百度官网 加载正常本地h5页面 加载空白,没有报错 override func viewDidLoad…

应力分析概要

1.概述 应力分析是一种用于结构件寿命分析的方法,最早的应用场景可能是路桥,因为西方提前我们两百年进入大工业时代。许多人工建筑的寿命是有限的,这类实际需求催生出寿命预测和诊断。结构件的失效,最根本的因素是因为应力的作用…