表结构设计的基本思路

2024-05-02 21:38
文章标签 结构设计 基本思路

本文主要是介绍表结构设计的基本思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

切入点

找到一个主表,比如你要设计一个某某产品的的管理系统,那么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

这篇关于表结构设计的基本思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955190

相关文章

关注/粉丝 表结构设计及查询(附带SQL)

表主要字段: iduser_idfocus_user_idcreate_timeid用户id被关注人id创建时间      user_id 设置索引 用于查询 我的关注   focus_user_id   设置索引 用于查询 我的粉丝   user_id ,focus_user_id 设置联合唯一索引 数据库约束控制 不会出现重复关注   create_time 设置索引 用于查询

nlp时序模型股价预测的基本思路(持续更新)

我觉得在学习时序预测的时候应该先了解它的思路 1.获取数据(很重要) 个人认为获取数据,包括数据的质量,类型,维度,以及精度,对我们模型的训练都十分重要。 2.数据划分 为什么要单独列出来,因为一般都是先划分完数据集再进行标准化,不然先标准化再划分会造成数据泄露。因为我们没有把我们所要去预测的那一列(label)去剔除,所以我们标准化的时候取值会把我们要预测的哪一列特征(label)带进去,这下

微信公众号之灵活自定义菜单显示包含数据库结构设计

前段时间,开发特别着急,所以对于自定义菜单的设置是以代码为基准编写的在,不能实现高可用。现在我将自定义菜单制作成数据表中,通过读取数据库表来进行创建自定义菜单 1、数据库表 package com.ihaidou.entity.db.wechat;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import

电磁阀厂家:电磁阀结构设计需要考虑哪些方面?

随着科技的不断发展,电磁阀产品的应用范围愈发广泛。但在选购产品时,要注意产品的结构以及设计,以确保产品满足应用场景的各项要求。那么,电磁阀结构设计需要考虑哪些方面?接下来就让专业的电磁阀厂家来为大家简单介绍一下: 据悉,电磁阀的结构主要包括电磁铁、阀体、阀芯、弹簧、密封件等部分。在进行产品设计时,需要考虑以下这几个方面: 1、阀体材质选择。阀体是电磁阀的主要承载部分,其材质需要具

【大模型应用开发极简入门】提示工程一:1. 通过context、task、role文本结构设计有效的提示词、 2. OpenAI的提示词任务示例

文章目录 一. chat_completion函数二. 设计有效的提示词1.上下文1.1. 更多细节的上下文1.2. 让GPT改进上下文 2.任务2.1. 提供足够的任务信息2.2. OpenAI的任务示例语法纠正总结TL;DR概要Python转自然语言计算时间复杂度修复Python bug产生python函数 3.角色 了解LLM和OpenAI API的基础知识,之后我们就可

原花青素优化定向壳聚糖微通道的简单免疫调控结构设计

引用信息 文  章:A facile   Immunoregulatory Constructional Design by Proanthocyanidin Optimizing   Directional Chitosan Microchannel 期    刊:Small(影响因子:13.3)    发表时间:29/02/2024 作    者:Li X, Wang Y, Zhao C,

推荐一个简单可靠的驰骋低代码组织结构设计,设计开发使用20年了

题目:推荐一个简单可靠的组织结构设计。 以下观点是驰骋低代码设计者的观念与主张,根据如下内容生成。 组织结构分为:单组织模式、集团组织模式、SAAS组织模式。组织结构包含,人员、部门、角色、人员部门的关系、人员部门角色的关系的管理与维护。驰骋低代码系统,工作流引擎系统,采用该设计20多年来,面对不同的组织对接都可以轻松应对。人员表:Port_Emp, 字段:No,Name,FK_Dept,

【机器学习300问】103、简单的经典卷积神经网络结构设计成什么样?以LeNet-5为例说明。

一个简单的经典CNN网络结构由:输入层、卷积层、池化层、全连接层和输出层,这五种神经网络层结构组成。它最最经典的实例是LeNet-5,它最早被设计用于手写数字识别任务,包含两个卷积层、两个池化层、几个全连接层,以及最后的输出层。 一、先用文字介绍一下这五层分别在做什么 (1)输入层         输入通常是经过预处理的图像数据,例如,将图像调整到特定尺寸(如32x32x3)

【操作系统期末速成】​操作系统概述(定义|功能|特征)|发展阶段和分类|结构设计|概念补充

🎥 个人主页:深鱼~🔥收录专栏:操作系统🌄欢迎 👍点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站  前言: 最近在备战期末考试,所以本专栏主要是为了备战期末操作系统这门考试,讲的比较浅显,但是都是期末常考的考点和题型,仅限于“期末不挂”的层面 ​ 一、操作系统的概念 1.操作系统的定义

【转载于腾讯大讲堂】如何进行字体结构设计

原文来自:djt.qq.com/article/view/860(参看原文地址) 【转载】字体设计结构调整方法 daisy  发表于 2013.10.8     107浏览    4讨论    作者:Teven,腾讯安全产品部设计师,字体研究爱好者。     我们在进行字体设计时往往是凭借着往日的一些汉字的经验来评估着一些字体设计是否合理是否好看,但是我们常常也会