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

这篇具有很好参考价值的文章主要介绍了Mysql以key-val存储、正常存储的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

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

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 每次有新增模块,服务端需要一起修改。但这个比较正常,大部分时候新增的功能,服务端总是需要做一些改动的

总结

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

到了这里,关于Mysql以key-val存储、正常存储的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql--InnoDB存储引擎--架构和事务

    MySQL进阶篇 InnoDB 逻辑存储单元主层级关系图: 1、表空间 表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。 2、段

    2024年02月14日
    浏览(36)
  • MySQL存储引擎InnoDB和MyISAM的区别?

    InnoDB和MyISAM是MySQL数据库两种常见的存储引擎,它们在性能、事务支持等方面有一些重要的区别。以下是它们的一些主要区别: 事务支持: InnoDB: 支持事务,具有ACID(原子性、一致性、隔离性、持久性)特性,适用于需要事务支持的应用,如银行、电商等。 MyISAM: 不支持

    2024年02月03日
    浏览(37)
  • java面经 MySQL 存储引擎--MyISAM和InnoDB的区别

    隔离级别 英文名称 含义 脏读 不 可 重 复读 幻读 未提交读 READ UNCOMMITTED 可读取其它事务未提交的结果 √ √ √ 提交读 READ COMMITTED 一个事务开始时,只能读到其他事务已经提交的修改。 例:如果A事务已经修改了XX,但还没提交,则B事务读XX时还是未修改的值。 ( Oracle等多

    2024年02月08日
    浏览(31)
  • 【Android】使用build.gradle.kt配置目标架构(abiFIlters)时报错 Val cannot be reassigned

    传统上我们会使用 groovy 语言的配置文件 build.gradle 来配置: 在app级别的build.gradle中的 android defaultConfig 添加子项 新版本的默认使用 kotlin 语言的配置文件 build.gradle.kt 来配置gradle: 相应地会想到使用下列代码来指定abi: 此时进行sync就会报错: Val cannot be reassigned Type mismatch.

    2024年01月25日
    浏览(27)
  • 后端配置项没有正常加载,上传插件不能正常使用!

    环境:VUE+SpringBoot 问题:ueditor插件上传图片页面提示【后端配置项没有正常加载,上传插件不能正常使用!】 先解释下ueditor是怎么实现上传的, VUE导入插件 读取前端配置,需要配置serverUrl 插件会根据serverUrl配置的地址去拿后端部分的配置 还是根据serverUrl配置的地址只是

    2024年02月13日
    浏览(35)
  • MySQL 数据存储和优化------MySQL索引原理和优化 ---- (架构---索引---事务---锁---集群---性能---分库分表---实战---运维)持续更新

    Mysql架构体系全系列文章主目录(进不去说明还没写完) https://blog.csdn.net/grd_java/article/details/123033016 本文只是整个系列笔记的第二章:MySQL索引原理和优化,只解释索引相关概念。 索引可以提高查询效率,影响where查询和order by排序,它可以从多方面进行分类,但是实际创建时

    2024年02月02日
    浏览(40)
  • MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?

                     💧 M y S Q L ⽀持哪些存储引擎?默认使⽤哪个? M y I S A M 和 I n n o D B 引擎有什么区别,如何选择? color{#FF1493}{MySQL ⽀持哪些存储引擎?默认使⽤哪个?MyISAM 和 InnoDB 引擎有什么区别,如何选择?} M y SQ L ⽀ 持哪些存储引擎?默认使 ⽤ 哪个? M y I

    2024年02月09日
    浏览(38)
  • MYSQL04高级_逻辑架构剖析、查询缓存、解析器、优化器、执行器、存储引擎

    ①. 服务器处理客户端请求 ②. 连接层 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接 经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行用户名密码认

    2024年02月12日
    浏览(30)
  • 什么是聚簇索引和非聚簇索引?它们有什么区别?MySQL支持哪些存储引擎?

    聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)是数据库中两种不同类型的索引结构,它们在存储和组织数据上有所不同。 聚簇索引: 聚簇索引是按照索引列的顺序重新组织数据的方式。它定义了表的物理排序方式,使得数据行按照索引列的顺序存储在磁盘上相邻

    2024年04月26日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包