SSM框架下,级联数据库表的访问查询

2023-11-02

SSM框架下,级联数据库表的访问查询

级联数据库表

在日常的软件设计中,多级联动的数据库表比较常见,如省市联动的数据,对这些数据按级分表的方式存储,以表示数据之间的包含关系。
一般情况下,不会使用外键将父、子级的数据库表进行关联,因为当需要对某个数据进行删除操作时,这个数据就需要数据库级联操作来去除对子表的影响,而这些操作的开销会很大(级数越多,开销越大)。
而解决这个问题的常用方法,就是在子级表中添加一个字段,存入对应父级表的id值,类似链表。

此设计,便于增加和更新操作,减小各级的耦合,类似于链表的结构,可以最大程度的减少对数据的修改。但空间的优化,导致的缺点毫无疑问的就是时间的牺牲。即当需要通过子级查询更上级的父级数据时,需要发起多次的查询。(子→父→爷)
例如: 通过一个商品,查询它所属的一级分类?(商品→N级分类…→三级分类→二级分类→一级分类)

如何快速通过子级查询父级?

下面进行一个粗糙的实验,使用SSM框架+MySQL+Junit,进行四级的级联查询(四级分类→三级分类→二级分类→一级分类),下例中均以一级分类作查询最终目标。

1.目前最原始的结构如下:
在这里插入图片描述
为了方便这里简化数据表的结构,对其重复进行10000次的查询,通过System.currentTimeMillis();记录时间差,当然由于Mybatis的一级缓存,使得这样重复查询的耗时、访问次数减少,这里粗糙地表现数据库的访问次数。

while (rount>=0){
            //实际上向数据库发起了4次查询
            FouthL fouth = dao.findFouth(1);
            ThirdL third = dao.findThird(fouth.getThird_id());
            SecondL second = dao.findsecond(third.getSec_id());
            FirstL first = dao.findFirst(second.getFir_id());
            //模拟提取数据
          first.getFir_data();
        }

输出:![在这里插入图片描述](https://img-blog.csdnimg.cn/20200907233822390.png#pic_center

2.常见的解决方法:
在子级数据库表中为每一个父级的id添加字段,即子级拥有所有父级的id信息,这样只需要2次查询即可实现子级查询父级,但随着级联的层数增大,空间的占用越大,浪费越大。
在这里插入图片描述

while (rount>=0){
            //实际上向数据库发起了2次查询
            FouthL fouth = dao.findFouth(1);
            FirstL first = dao.findFirst(fouth.getFir_id());
          first.getFir_data();
        }

在这里插入图片描述
由于Mybatis的一级缓存,这里的耗时差距并不明显,但数据库的访问量极大的减少了。

3.个人的一些修改方式
当我们能确定每一级数据的数据量和级数时
如:这里的数据只有4级,每个父级的数据不超过1000个
我们可以将多个父级id字段进行合并,以500055001表示id为500,55,1的一级,二级,三级分类的id值(这里不使用varchar类型,是因为拿到数据后,切割字符串会造成内存的大量浪费)
这样减少数据库的空间浪费,通过代码运算将字段拆分回多个父级的id,但牺牲了部分CPU性能。
在这里插入图片描述

while (rount>0){
            //实际上向数据库发起了2次查询
            FouthL fouth = dao.findFouth(2);
            BigInteger parentId = fouth.getParent_id();
            //分解出各级id
            //这里对应万位为一级分类的id,百位~千位为二级id,十位~个位为一级id
            int fir_Id = parentId.divide(new BigInteger("10000")).intValue();
            int sec_Id = parentId.divide(new BigInteger("100")).mod(new BigInteger("100")).intValue();
            int third_Id = parentId.mod(new BigInteger("100")).intValue();
            //查询首级分类
            FirstL first = dao.findFirst(fir_Id);
          first.getFir_data();
        }

在这里插入图片描述
最后,各个方案都有优缺点,具体需要根据软件的设计需求来决定。

作为一个初出茅庐的新人菜鸟,文中有不当之处,还请各位多多指正!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSM框架下,级联数据库表的访问查询 的相关文章

  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • 在 Compose 中使用 Koin 进行依赖注入

    The pragmatic Kotlin Kotlin Multiplatform Dependency Injection framework 实用的Kotlin和Kotlin多平台依赖注入框架 Android Studio环境为 And
  • 浮动IP(FLOAT IP)

    主要谈一谈关于浮动IP的东西 介绍下浮动IP是什么 1 为什么要有浮动IP这个东西 现在有一个场景 在一台Linux上部署一个web应用 应用跑在tomcat里面 linux网卡上的ip是115 239 100 120 大致就是如下的部署关
  • 狂学数据库之关系模式的设计问题及数据的函数依赖

    关系模式的设计问题及数据的函数依赖 一 关系模式的设计问题 1 1 数据依赖 1 2 数据依赖对关系模式的影响 二 数据的函数依赖 2 1 函数依赖 2 1 1 函数依赖的定义 2 1 2 函数依赖的3种基本情形 2 2 函数依赖和码 关键
  • mmdetection用mmclassification的backbone

    接上篇 1 现需要将 backbone 换成 DeiT tiny 2 3 MMDetection 4 不直接支持 DeiT backbones 下没有 但 MMClassification 有实现 参考 6 7 可以直接在 MMDetect
  • 神经网络学习笔记(一) RBF径向基函数神经网络

    RBF径向基函数神经网络 初学神经网络 以下为综合其他博主学习材料及本人理解所得 一 径向基函数RBF 定义 Radial basis function 一种距离 径向基函数是一个取值仅仅依赖于离原点距离的实值函数 也就是 x x 或者还可
  • 免费WebAR与小程序AR制作平台推荐

    最近由于项目需要调研了一下WebAR相关的解决方案 由于学艺不精 项目时间紧张 我的基本诉求是要找一款零门槛 最好不要编写代码 能制作出精美交互以及模型动画能出效果的WebAR SDK或平台 几经周折 在B站上意外发现了一款名为Kivicu
  • 编写测试用例的七种方法

    1 测试用例的概念 测试用例是为了实施测试而向被测试系统提供的一组集合 这组集合包括 测试环境 操作步骤 测试数据 预期结果等要素 2 常见编写测试用例的七种方法 基于需求的设计方法 等价类 边界值 因果图 场景设计法 错误猜测法 3 基于
  • norm.interval和t.interval不能直接求样本的置信区间

    按网上搜到的结果调用scipy stats包计算参数已知的置信区间 from scipy import stats as sst conf int sst norm interval 0 95 loc 82 scale 20 conf in
  • js中数组是如何在内存中存储的?

    数组不是以一组连续的区域存储在内存中 而是一种哈希映射的形式 它可以通过多种数据结构来实现 其中一种是链表 js分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段 它们的值都有固定的大小 保存在栈空间 通过按值访问 引用类型是保存
  • Centos7 linux下 安装 Redis 5.0

    网上找了很多文章 发现不全而且有些问题 安装很多次之后 总结一篇可以使用的 记录之 环境 Centos7 Redis 5 0 如果环境不符合 本篇仅供参考 1 准备工作 作者习惯软件安装包放在单独路径 解压路径也放在单独路径 下载路径 mk
  • MATLAB2018B下用Faster-RCNN做目标检测的训练和测试步骤

    近些年 随着深度学习在计算机视觉领域中的蓬勃发展 利用卷积神经网络对图像进行分类 以及对图像中目标进行识别定位成为比较前沿的技术 本文比较详尽的介绍了在MATLAB2018b环境下 利用Faster RCNN对图像进行迁移学习 从而使其能够
  • The maximum string content length quota (8192) has been exceeded while reading XML data

    问题场景 在我们WCF服务发布后 我们要确保服务端以及客户端的配置文件允许合适大小的传输设置 笔者在发布WCF服务时 服务端的绑定未做传输大小的设置 采用了默认 maxStringContentLength默认大小为8192 而我们在传输序
  • 机器学习就业法则

    人工时代的来临 也使我们的教育向信息化和数据化发生转变 机器人教育既符合国家发展战略需要 格物斯坦与此同时 人工智能 教育 的培养方案与社会对于未来人才的能力要求完美匹配 自动驾驶 离群人群自动检测 比如机场和火车站的恐怖分子检测 等应用都
  • Nacos startup无反应,启动报错的解决办法

    今天在运行Nacos的时候遇见了点问题 记录一下 我的系统是win11 运行的Nacos版本是 2 0 3 https github com alibaba nacos releases tag 2 0 3 运行startup cmd 无反
  • 虚拟机 ifconfig命令后无法获得网卡信息和IP地址

    问题出现原因 虚拟机挂起后重新打开失败 重启虚拟机后 无法连接到网络 使用ifconfig命令查看ip 发现网卡没起开 而且ping www baidu com 报错 后面尝试修改了一些配置文件 都没好使 最后使用这个方法 sudo dhc
  • C++ 正态分布随机数 平均分布随机数 default_random_engine normal_distribution

    include
  • elasticsearch match模糊查询

    目录 python查询自定义字段 elasticsearch 中term与match区别 python查询自定义字段 import json from elasticsearch import Elasticsearch es Elasti
  • jdk-8u151-nb-8_2-windows-x64软件安装教程及环境配置

    亲测可用
  • 【TCP协议】MTU和MSS详解

    需要注意的是 区别两种帧封装格式 802标准帧和以太网帧 1 在802标准定义的帧格式中 长度字段是指它后续数据的字节长度 但不包括C R C检验码 RFC 1042 IEEE 802 2 RFC 894 以太网 所以 以太网帧报头为目的地
  • SSM框架下,级联数据库表的访问查询

    SSM框架下 级联数据库表的访问查询 级联数据库表 如何快速通过子级查询父级 级联数据库表 在日常的软件设计中 多级联动的数据库表比较常见 如省市联动的数据 对这些数据按级分表的方式存储 以表示数据之间的包含关系 一般情况下 不会使用外键将