设计实现数据库表扩展的7种方式

设计实现数据库表扩展的7种方式

免费 开朗的高级母亲和成年的女儿一起使用智能手机 素材图片

 在软件开发过程中,数据库是一项关键技术,用于存储、管理和检索数据。数据库表设计是构建健壮数据库系统的核心环节之一。然而,随着业务需求的不断演变和扩展,数据库表中的字段扩展变得至关重要。

当表结构固定后,新增的业务需要通常会要求增加字段,这时该如何灵活实现字段扩展呢?本文提供以下几点设计思路,以平衡灵活性和可扩展性,确保数据库系统能够适应不断变化的需求。

使用预留字段

在表设计初期,可以预留一些命名通用的备用字段,例如field1、field2、field3。当业务需要增加新字段时,就直接使用这些预留字段,无需修改表结构。

例如用户表预留5个扩展字段,新需求需要记录用户注册渠道,可以直接使用field1存放,不影响旧数据和业务。

适用于需求变化较小、对表结构影响较小的场景。可以将部分非关键数据放在预留字段,实现轻量级扩展。

使用JSON字段

JSON支持内嵌文档格式,可在一个字段存储更多结构化信息。当需要新增属性时,直接在JSON字段加入新属性即可,不影响旧数据。

例如产品表的扩展信息originInfo,可设为JSON字段,后续需要增加产品线上时间,直接在originInfo加入即可。

适用于需要存储结构化扩展信息的场景。可在JSON中嵌套存储对象或数组,扩展灵活。

使用单表继承

similar类业务可设计基类表,如product_master。新类型产品创建子表product_book继承master,同时加入特有字段。查询时可union all。

例如电商商品表,可以创建书籍表、服饰表继承商品表,加入书籍特有字段。查询可以union出所有结果。

适用于同主题的类似数据类型,需要区分但相关度密切的不同业务表。继承可减少冗余。

构建属性表

设置主题属性表,类型+属性名作为联合主键,存储主题扩展信息。新属性直接增加记录即可扩展,不影响主表。

例如用户属性表,用户ID+属性名作为联合主键,值存储属性内容。需要增加用户性别时,直接新增记录。

适用于主体和属性松耦合的场景。主表存储主体,属性表存储可扩展信息,解耦影响。

CREATE TABLE `wp_postmeta` (`meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`post_id` bigint(20) unsigned NOT NULL DEFAULT '0',`meta_key` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`meta_value` longtext COLLATE utf8mb4_unicode_ci,PRIMARY KEY (`meta_id`),KEY `post_id` (`post_id`),KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

使用Schema字段

指定字段为Schema数据类型,内部存储属性集合。读取时可转换为对象,实现扩展。

例如产品属性schema字段,可直接以JSON格式存储和读取扩展属性,效果与4类似。

适用于需要频繁变化的结构化扩展信息。方便直接操作Schema字段扩展属性。

使用新表继承数据

major变更可创建新表,使用触发器等自动将旧表数据复制到新表。新功能在新表操作。

例如订单表需要大改造,可建新表,触发器复制旧订单数据,新订单进入新表,支持新功能。

适用于对旧表影响太大、需要全新表结构的场景。通过触发器等继承旧数据,实现平滑衔接。

适当冗余

关键扩展需求可适当冗余字段,控制在可接受范围内。避免频繁修改表结构影响业务。

例如用户表可提前增设推荐人字段,考虑未来可能的推广需求。

适用于对某些关键扩展需求能够预见的场景。适度冗余特定字段,避免频繁影响旧表。

数据库表设计中的字段扩展是一个关键问题,需要在灵活性和可扩展性之间取得平衡。通过深入了解需求、选择合适的数据类型、使用扩展属性和关联表,以及权衡性能和查询效率,可以实现可维护和可扩展的数据库系统。在设计过程中,密切与业务团队合作,并考虑未来的需求变化,将有助于构建适应不断变化的业务环境的数据库系统。

希望这些详细的描述和举例能够帮助读者进一步理解各种实现字段扩展的设计思路。如果还有需要补充和完善的地方,请您指出,我会继续努力。

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

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

相关文章

[OnWork.Tools]系列 06-屏幕水印

简介 屏幕水印功能主要是在开会分享屏幕的时候在屏幕上增加水印 水印使用 水印启用和颜色设置 水印文字和大小设置 水印间距,透明度,角度调整

centos安装python3的多个版本

标题 原本安装了python3.6,但是又有一个项目需要py3.7,所以需要让两个版本共存 操作 1、下载py3.7 wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz2、解压 tar -xzvf Python-3.7.3.tgz进入到文件夹 cd Python-3.7.33、安装 本人c…

day10 快速排序 方法重载 和 方法递推

方法重载 斐波拉契数列问题 使用重载思想解决 public static int method(int n){if (n 2 ){return 1 ;}return (n-1)*2method(n-1);}public static int f(int n){if (n 1){return 1;}if (n 2){return 2;}return f(n-1)f(n-2);} 快速排序 思维很简单,类似二…

Zookeeper 面试题

一、ZooKeeper 基础题 1.1、Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布和订阅。 通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机…

【java】【maven】【高级】MAVEN聚合继承属性等

目录 1、模块开发与设计 2、聚合 2、继承 3、属性 4、版本管理 5、资源配置 6、多环境配置 7、多环境开发配置 8、跳过测试 9、私服 前言:maven的高级使用包含分模块开发与设计、聚合、继承、属性、版本管理、资源配置、多环境配置、多环境开发配置、跳过…

Spring Cloud 的版本和SpringBoot的版本

Spring Cloud 的版本选择 Spring Cloud 和SpringBoot的版本存在对应关系 Spring Cloud 的版本和SpringBoot的版本,存在对应关系。最新的SpringCloud版本(发布文章时为2022.0.3),需要SpringBoot(3.0.9) 的…

IDEA常用插件介绍

1.CodeGlance(CodeGlance Pro) 安装后,重新启动编译器即可。 CodeGlance是一款非常好用的代码地图插件,可以在代码编辑区的右侧生成一个竖向可拖动的代码缩略区,可以快速定位代码的同时,并且提供放大镜功能…

Flutter:文件读取—— video_player、chewie、image_picker、file_picker

前言 简单学习一下几个比较好用的文件读取库 video_player 简介 用于视频播放 官方文档 https://pub-web.flutter-io.cn/packages/video_player 安装 flutter pub add video_player加载网络视频 class _MyHomePageState extends State<MyHomePage> {// 控制器late…

centos8.5本地yum源报错

在下载文件出现以下错误 [rootserver ~]# yum install gcc Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. RHEL8.5-BaseOS …

rust基础

这是笔者学习rust的学习笔记&#xff08;如有谬误&#xff0c;请君轻喷&#xff09; 参考视频&#xff1a; https://www.bilibili.com/video/BV1hp4y1k7SV参考书籍&#xff1a;rust程序设计语言&#xff1a;https://rust.bootcss.com/title-page.htmlmarkdown地址&#xff1a;h…

Blazor前后端框架Known-V1.2.11

V1.2.11 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

springboot启动忽略某些类

springboot启动忽略某些类 描述解决方案单拉一个提交&#xff0c;把所有的涉及kafka消费的都不注入容器通过配置ComponentScan的excludeFilters配置了不生效后续处理改之前改之后解释 总结 拆分环境 感触解决实现demo参考 描述 目前我这的开发环境和测试环境数据库是两份&#…

opencv基础-33 图像平滑处理-中值滤波cv2.medianBlur()

中值滤波是一种常见的图像处理滤波技术&#xff0c;用于去除图像中的噪声。它的原理是用一个滑动窗口&#xff08;也称为卷积核&#xff09;在图像上移动&#xff0c;对窗口中的像素值进行排序&#xff0c;然后用窗口中像素值的中值来替换中心像素的值。这样&#xff0c;中值滤…

【算法|数组】双指针

算法|数组——双指针 引入 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;…

gitee linux免密/SSH 方式连接免登录

目录 生成SSH公钥通过 ssh-keygen 程序创建找到SSH公钥 在gitee中添加公钥 生成SSH公钥 通过 ssh-keygen 程序创建 shell> ssh-keygen -t rsa -C "xxxxxx.com" Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rs…

JVM详情

JVM详情 一、JVM内存划分二、双亲委派模型&#xff08;重点考察&#xff09;三、 GC&#xff08;垃圾回收机制&#xff09;垃圾的判定算法垃圾回收算法 一、JVM内存划分 堆&#xff1a;存放new出来的对象&#xff1b;&#xff08;成员变量&#xff09; 方法区&#xff1a;存放…

flutter:二维码生成与读取

前言 这csdn真的是服了&#xff0c;图片里有个二维码就直接变成违规图片了。至于效果的话&#xff0c;自己运行一下看看吧。 生成 flutter中生成二维码可以使用 qr_flutter。 官方文档 https://pub-web.flutter-io.cn/packages/qr_flutter 安装 flutter pub add qr_flutt…

Visual Studio Code中对打开的脚本格式统一

什么是Language Server Protocol (LSP)? Language Server Protocol&#xff08;语言服务器协议&#xff0c;简称LSP&#xff09;是微软在2016年提出的一套统一的通讯协议方案。LSP定义了一套编辑器或者IDE与语言服务器&#xff08;Language Server&#xff09;之间使用的协议&…

网络基本概念

目录 一、IP地址 1. 概念 2. 格式 3. 特殊IP 二、端口号 1.概念 2. 格式 3.注意事项 三、 协议 1. 概念 2. 作用 四、协议分层 1. 网络设备所在分层 五、封装与分用 六、客户端和服务器 1. 客户端与服务器通信的过程 一、IP地址 1. 概念 IP地址主要用于标识网络主机.其他网络…

基于关系有向图的知识推理2022ACM 8.9

基于关系有向图的知识推理 摘要介绍相关工作基于路径的方法基于GNN的方法 关系有向图RED-GCN实验 摘要 知识图推理旨在从已有的知识中推断出新的事实。基于关系路径的方法在文献中显示出较强的可解释性和归纳推理能力。然而&#xff0c;在KG中 捕获复杂拓扑(Capturing complex…