表结构设计的基本思路

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

切入点

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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

商朝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值