表结构设计的基本思路

2023-11-08

首先在开启一个项目时,至关重要的第一步就是设计表结构,很多小伙伴在初入职场的时候找不清如何下手只是感觉很乱,那么今天我提供几个基本的思路

切入点

找到一个主表,比如你要设计一个某某产品的的管理系统,那么ok这张产品表就是我们的主表,它作为主干来分支,一个产品基本的字段我们先创建出来比如(id,name,status…),何为基本呢?就是不涉及第二张表的字段.

第二步

需要考虑业务逻辑了,比如一个产品对应一个用户啊,一个产品对应多个供销商啊,一个供销商对应多个商品啊,一个产品对应多条评论啊,一个产品对应多张logo啊,多个产品对应一个订单,同时多个订单对应一个产品啊诸如此类的考虑,
对没错,我们首先要考虑的是根据具体的场景捋清楚是几对几的关系

比如第一条,一个产品对应一个用户没错吧,这种一对一的关系我们用外键去做,而用户显然就牵扯出了第二张表-用户表,先不要考虑用户表中有什么,我们只关注这个产品表中的外键怎么连接上它,显然产品表中加一个user_id就可以了,sql语句left join user on user.id = product.user_id.与此同时产品表的实体类的属性也需要加入userId这个属性

再来一个一对多,一个产品对应多个logo可以吧,而一个logo只能对应的一个产品没错吧,ok这是一个典型的一对多的关系,这种时候就需要在"多"这个表中加外键去连接主表,什么意思呢?就是这里显然牵扯出了logo这张表-pic,那么它里面就需要加入一个字段product_id,而product的实体类中就需要加入一个List集合专门放logo的对象,使用Mybatis就要使用ResultMap了,如下

<ResultMap id="productResultMap" type="product">
	<id column="id" jdbcType="char" property="id" />
	<result column="name" jdbcType="varchar" property="name"/>
	<result column="status" jdbcType="int" property="status"/>
	<collection property="list" ofType="pic">
    	<id column="picid" jdbcType="char" property="id" />
    	<result column="picname" jdbcType="varchar" property="name" />  
    	<result column="picproductid" jdbcType="char" property="picproductId" />  
  </collection>
</ResultMap>
<select resultMap="productResultMap">
	select p.id,p.name,p.status,pic.id as picid,pic.name as picname,pic.product_id as picproductid from product p left join pic on pic.product_id = p.id where p.id = #{id}
</select>

ok那么如此这般,我们一对多的关系就搞定了,那么一个产品对应多个评论是不是也一样,你会发现已经解决80%的问题了

剩下20%的问题,多对多的关系:一个产品对应多个供销商没错,可是一个供销商可以对应多个产品啊,再比如一个产品对应多个订单,一个订单又可以对应多个产品,这种关系称为多对多的关系,处理他们就需要在中间加一张桥表比如第一个场景:
我们需要这么一张表:product-producor (id,product_id,producor_id)三个字段,而实体类中在两个pojo类中都需要加入一个存放彼此的list集合,那么我们在查询的时候就需要两个ResultMap分别取对应product和producor两个pojo类
1.product的pojo

<ResultMap id="productMap" type="product">
	<id column="id" jdbcType="char" property="id" />
	<result column="name" jdbcType="varchar" property="name"/>
	<result column="status" jdbcType="int" property="status"/>
	<collection property="list" ofType="producor">
    	<id column="prid" jdbcType="char" property="id" />
    	<result column="prname" jdbcType="varchar" property="name" />  
  </collection>
</ResultMap>
<select resultMap="productMap">
select pt.id,
		pt.name,
		pt.status,
		pr.id as prid,pr.name as prname 
		from product pt 
		left join product-producor as pp on pt.id =pp.product_id 
		left join producor pr on pr.id =pp.producor_id 
		where pt.id=#{id}
</select>

2.producor的pojo

<ResultMap id="producorMap" type="producor">
	<id column="id" jdbcType="char" property="id" />
	<result column="name" jdbcType="varchar" property="name"/>
	<collection property="list" ofType="product">
    	<id column="ptid" jdbcType="char" property="id" />
    	<result column="ptname" jdbcType="varchar" property="name" />  
    	<result column="ptstatus" jdbcType="int" property="status"/>
  </collection>
</ResultMap>
<select resultMap="producorMap">
select pr.id,
		pr.name,
		pt.status as ptstatus,
		pt.id as ptid,
		pt.name as ptname from producor pr 
		left join product-producor as pp on pr.id =pp.producor_id 
		left join product pt on pt.id =pp.product_id 
		where pr.id=#{id}
</select>

第三步

补充牵扯到的其他表的其他字段,比如刚才说的logo,不能只有一个product_id吧还得有它自己的字段属性,比如存放地址啊,图片格式啊,上传时间啊各种,把诸如此类的不涉及多张表的字段,也就是属于它自己的属性性值的字段给添上

第四步

以每一张表为主表去考虑是不是还有对应关系,比如说一个供销商是不是可以对应一下评论表,而且还是一个供销商对应多条评论的关系,再如一个用户是不是可以对应多个供销商,一个供销商是不是可以对应多个用户(粉丝系统)…诸如此类,你会发现所有的关系都离不开这三类,所以再以每一张表为主表,该加外键加外键,该加桥表加桥表,查询的时候脑子一定要清晰返回哪个pojo类想明白

总结

ok基于Mabatis的表设计就说这么多,这是一个项目可以说是最关键的一步,希望大家开发路上少一些bug

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

表结构设计的基本思路 的相关文章

  • 第2课:Scratch介绍

    什么是Scratch Scratch 一款免费的图形化少儿编程工具 由麻省理工学院设计开发 它是完全免费的 它将一大片代码变成一个个功能模块 界面非常清晰 小朋友可以像搭积木一样做出自己的游戏程序 对于低年级的小朋友很容易上手 而且很容易培

随机推荐

  • 使用k8s业务在十几分钟无人使用时,访问报错问题

    业务放入k8s测试中发现当十几分钟没有访问 再次访问时就会报错 刷新后业务正常 一直访问故障不复现 通过整体测试发现Redis自动断开连接 redis在使用net网络模式时会出现自动断开问题 升级Redis版本后解决
  • 傅里叶变换,高通,低通滤波

    傅里叶变换 傅里叶变换的作用 高频 变化剧烈的灰度分量 例如边界 低频 变化缓慢的灰度变量 例如一片大海 滤波 低通滤波器只保留低频 会使头像模糊 高通滤波器只保留高频 会使图像细节增强 opencv主要就是cv2 dft 和cv2 idf
  • 机械臂机器人——使用Matlab Robotic ToolBox建立四轴机械臂模型并实现运动控制仿真

    文章目录 四轴机械臂实物 Robotic ToolBox机械臂建模 1 建立机械臂的D H表 建立机械臂坐标系 根据坐标系建立D H表 2 代码建模 机械臂运动学仿真 1 正运动学仿真 2 逆运动学仿真 为了能够实现机械臂的运动轨迹规划 同
  • Github Page 个人主页——自定义域名

    1 前言 看本文前请确认已部署好基础的静态网页 参考上篇文章 Github Page 个人主页 项目部署 部署好的个人网页若使用 username github io 访问 会让别人很难记住 这时就可以使用自定义域名来绑定仓库了 本文将介绍
  • Centos 安装 Kafka 后台启动 教程

    安装 官网 http kafka apache org downloads 1 下载 Python wget http mirrors tuna tsinghua edu cn apache kafka 0 11 0 0 kafka 2 1
  • html自动图片尺寸,关于html:CSS背景图像适合宽度,高度应按比例自动缩放

    我有 body background url images background svg 期望的效果是该背景图像的宽度等于页面的宽度 高度变化以保持比例 例如 如果原始图像恰好是100 200 任何单位 且正文宽度为600px 则背景图像最
  • 2021-11-02 B1026 简单的时间转换显示和将小数四舍五入

    B1026 简单的时间转换显示和将小数四舍五入 原题 1026 程序运行时间 15 分 要获得一个 C 语言程序的运行时间 常用的方法是调用头文件 time h 其中提供了 clock 函数 可以捕捉从程序开始运行到 clock 被调用时所
  • java没有报错,但编译失败。

    这段代码总是编译失败 但是idea没有报错 这东西是抽象类 解决办法 jdk版本问题 虽然都是1 8 换成了333就没问题了 个人经验 换成版本高的试试
  • C++: 'identifier': identifier not found [Compiler Error C3861]

    问题 模板类继承模板类时 子类无法直接访问父类成员 会报如下错误 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3861 insertAsLast 找不到标识符 DSA D Code DSA DSA Queue h 8 环境 V
  • 解决Vscode中unresolved import “XXX” 问题

    正常导入同级目录的 py文件 报黄色警告 原因 在Vscode中 import后面跟着的 必须是全路径 将import后面的文件路径 修改成全路径 便不会有unresolved import XXX 警告
  • adele心理学

    人生中最大的谎言就是不活在此时此刻 纠结过去 关注未来把微弱而模糊的光打向人生整体 自认为看到了些什么 你之前就一直忽略 此时此刻 只关注根本不存在的过去和未来 对自己的人生和无可替代的刹那撒了一个大大的谎言 我们应该更加认真地过好 此时此
  • 华为OD机试 C++ 异常的打卡记录

    描述 我们的目标是查找出那些异常的员工打卡记录 异常的定义是 打卡所用的设备号与员工注册的设备号不匹配 同一个员工两次打卡的时间间隔小于60分钟 但距离超过5km 你会得到一个字符串数组 里面包含每条打卡记录 格式为 工号 时间 分钟 距离
  • gcc与g++的安装和使用

    首先大致介绍一下gcc和g 在此之前 你需要先安装gcc与g 然后才能进行指令操作 命令如下 sudo yum install y gcc c 在命令行输入以上指令后 gcc g 便成功安装了 gcc是一个专门用来编译链接c语言的编译器 g
  • @EnableAspectJAutoProxyAop注解实现

    转载 https www cnblogs com foreveravalon p 8653832 html 在这个注解比较流行的年代里 当我们想要使用spring 的某些功能时只需要加上一行代码就可以了 比如 EnableAspectJAu
  • Git学习:git 生成 patch的命令

    个人理解 patch就是打补丁 通过git工具把代码的差分 生成patch文件 然后通过git工具可以直接把patch文件的内容 merge到代码里面 生成patch的命令 git diff gt patch 本地变更 git diff 的
  • python-面向对象

    一 什么是面向对象 1 什么是面向对象 概念 根据模板 创建一个类 实例化一个类 面向对象 2 面向对象的好处 可重复使用 实例化类 容易修改 只用修改类的模板 3 面向对象的特点 封装 继承 多态 4 类名首字母必须大写 5 面向对象的案
  • 详细解说 STL 排序(Sort)

    详细解说 STL 排序 Sort 0 前言 STL 为什么你必须掌握 1 STL提供的Sort 算法 1 1 所有sort算法介绍 1 2 sort 中的比较函数 1 3 sort 的稳定性 1 4 全排序 1 5 局部排序 1 6 nth
  • 避障雷达IO输出记录

    避障雷达的使用首先需要在软件上划分区域 区域一共可以划分为3个 代码实现部分 第四个雷达处理算法 后边雷达 int alarm int a int b int array 8 for int i 0 i lt 8 i b a 1 a uns
  • MISRA C_2012规则翻译、解读、示例

    目录 一 MISRA C 2012介绍 二 MISRA C 2012每条规则翻译 解读 示例 Rule 1系列 标准C环境准则 Rule 1 1 程序不应包含任何违反标准C语法和约束的内容 也不应超过实现的转换限制 Rule 1 2 不应使
  • 表结构设计的基本思路

    首先在开启一个项目时 至关重要的第一步就是设计表结构 很多小伙伴在初入职场的时候找不清如何下手只是感觉很乱 那么今天我提供几个基本的思路 切入点 找到一个主表 比如你要设计一个某某产品的的管理系统 那么ok这张产品表就是我们的主表 它作为主