关于数据库表数据关联的问题

来源:4-6 设计产品表和商品表(二)

慕雪芸茗

2019-07-05

老师,我有一个困惑我很久的问题。我拿一个简单的例子来说明,比如我在开发一个特别简单的系统,只考虑两张数据库表 商品类别表 和 商品表。

商品类别表:

CREATE TABLE goods_type (
	type_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
	type_name VARCHAR(50) NOT NULL COMMENT '类别名称',
	sort INT UNSIGNED DEFAULT 0 COMMENT '排序'
) COMMENT '商品类别表';

商品表:

CREATE TABLE goods (
	goods_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
	type_id BIGINT UNSIGNED NOT NULL COMMENT '商品类别ID',
	goods_name VARCHAR(50) NOT NULL COMMENT '商品名称',
	price DECIMAL(8, 2) UNSIGNED DEFAULT 0 COMMENT '商品价格'
) COMMENT '商品表';

此时,假如现在正在开发后台的管理系统,已经开发到了商品功能这一块,一般都是在商品这个功能子页面展示一张表格显示系统中的商品信息,诸如这样子的:

http://img.mukewang.com/szimg/5d1f11980001992707140166.jpg

只不过表头是显示的是 商品名称 商品类别 商品价格 ...... 这样的字样。

那么问题来了,我们在网页上展示数据的时候总不能在商品类别这一列显示一个数字,这个鬼能知道是什么类别呢。而数据库中存储的确实是类别的ID,那么这就涉及到在展示数据时需要根据类别ID在数据库中找出与之对应的类别名称。最简单暴力的办法就是在代码中先查出商品数据,然后循环数据查出每一个商品的类别名称(这里可能效率有些低,可以循环数据得到一个类别ID数组然后使用IN批量查询,但是这不是重点)或者使用join查询直接查出结果,但是我总感觉这样做不是很优雅,而且效率也好像一般的很,我自己一贯的做法是在商品表中多添加一个字段type_name来专门冗余的存储一份商品类别名称,但是这样也不够优雅,对于我个人而言,虽然我是这么做了,但是还是心里感觉不完美,总感觉是多浪费一点空间(强迫症吧),这都是其次,还会有一个问题就是当某一个类别的名称发生变化之后,商品表中该类别的商品记录依旧还是存储着之前老的类别名称,如果想同步更新就要在修改类别的时候进行批量更新相关商品记录,这个也很头疼。所以我很想问问老师,您遇到这样的问题一般会怎么处理?或者说有没有什么更加优美的解决方案?

写回答

2回答

神思者

2019-07-05

这个问题你不用纠结,数据库范式告诉告诉我们要把数据拆分存储。拆分存储必然会用到表连接查询,所以表连接查询是很正常的事情。

1
0

imcarlos

2022-05-03

这个问题就是我现在纠结的
0
0

阿里新零售数据库设计与实战 (升级版)

解锁“新零售”业务让数据库实战能力再上一层楼

2101 学习 · 701 问题

查看课程