大家看看这个数据表怎么设计最简单?

大家看看这个数据表怎么设计最简单?

发现组卷网的这个选题有点厉害,单独的无限级分类,只要选择子级,将父ID都一起存到数据库即可,但是同样的数据,关联多个无限级分类,还真不太好设计,

比如说后台,选择一个分类下的一个子级,那么根据关联关系,我可以得到其他分类的所有关联关系,如果都提前存储,添加一个新教材怎么办呢?

如果不提前存储,那搜索的时候怎么办呢?

还真挺难搞的呀。

补充说明:

下面的所有设计均为初步想法,包括分类表,都可以推翻重来。

一般来说,无限级分类, 数据表为以下做法

教材1

id name parent_id
1 第一章 运动与描述 0
2 1 质点 参考系和坐标系 1
3 质点 2
4 新的1级 0
5 新的2级 4
6 新的3级 5

那么文章表设计如下

id name cate_id cate_ids
1 文章1 3 1,2,3
2 文章2 3 1,2,3
3 文章3 6 4,5,6

查询时如下, 不管是查询最底层的id,或者其中的任何一个父级

SELECT * from 文章表 WHERE FIND_IN_SET(查询的ID, cate_ids)

那么最上图的截图,问题是什么呢?
可以有多个新的无限级分类,无限级分类的最底层(last children)是有关联的,1对1,都可以查询到这个文章表
例如:一个新的无限级分类

教材2

id name parent_id
8 第一章 匀变速直线运动 0
9 A. 质点 位移和时间 8
10 质点 9

那么我们可以人为的不管是加一个表或者怎么处理,让他们有一个对应的1对1关系

教材1 1id 教材2 id 教材3 id
3 10 …..

这样我们在文章表插入数据时,只需要以其中的一个分类为基础,就可以查找到所有相关的无限级分类,

那么最简单粗暴的方法
在文章表或者新开一个表, 增加分类字段,在入库之前

id name cate_id cate_ids cate_id2 cate_ids2 cate_id3…
1 文章1 3 1,2,3 10 8,9,10
2 文章2 3 1,2,3 10 8,9,10
3 文章3 6 4,5,6 15 3,6,15

这样查询时,我们会知道,他是从哪个分类来的

SELECT * from 文章表 WHERE FIND_IN_SET(查询的ID, 分类_ids)

这样虽然可以实现功能,那如果我今天,又想增加一个新的分类表呢?不能所有文章编辑一遍吧,当然也可以跑个脚本,所有文章自动改一遍。

不知道大家有什么更好的想法没?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 12
陈先生

file

如果你想继续问,请告诉我你对于这个表结构的想法以及你认为这个表结构为什么这么设计,这是一个年代比较久远项目的表。 当时是用来做分销等级和无限级设定的。

11个月前 评论
Adachi (楼主) 11个月前
陈先生 (作者) 11个月前

是不是可以理解为:同一篇文章,可以从属于不同的分类?

如果是这类问题的话,就不能在文章这一维度记录所属的分类了,需要单独建一个表进行关联,表结构大致如下:

字段 描述
article_id 文章ID
cate_id 文章分类ID

在分类表上,我一般会单独加两个层级相关的字段:

字段 描述
total_cate_id 完整分类ID 如:1:2:3
total_cate_name 完整分类名称 如:一级分类:二级分类:三级分类

这样在处理多级分类的时候,就不需要通过遍历查询了,效率有所提升。

这样设计的话,可以通过文章反向查询到所有从属的分类,也可以通过分类查到下面所有的文章。

11个月前 评论
Adachi (楼主) 11个月前

关于无限分类,你可以搜索下 预排序遍历树 ,也即 MPTT 虽然比 id pid 复杂,但是处理无限级树形结构非常合适。

11个月前 评论
Adachi (楼主) 11个月前
巅峰互联

首先是 tree 表格数据,然后 分类数据,随后 内容数据,中包含 tree数据最小节点id 以及分类id。 或者采用。es 直接搜索,完美解决你的问题。

11个月前 评论

这是两套分类。

一个是多级分类,一个是标签分类。

顶端和左侧的是一个多级分类。用于章节选题。

题目列表上面的内容是标签分类,用于知识点选题。

从链接格式也能看出是怎样构造的。

11个月前 评论

递归,简单方便,而且新增分类你怎么知道这类知识点是属于这章(分类)的,这种情况大多数都是人工处理(我觉得),脚本也没这么智能。除非补上一个额外知识点的分类,这个分类关联题目和(章节)分类

11个月前 评论

根据我看“组卷网”之后,个人有个想法:
整个设计分为三个模块:教材表(无限极分类),文章表、标签表
其中:
教材表关联标签表 (1:N),其中如果子集关联的标签必然也关联父级
文章表关联标签表(1:N),
这时候新建或者编辑的教程表中的任何级别,只要打上这标签,就能关联有这标签的文章...

11个月前 评论
sanders

盲猜设计分为:版本、教材、章节、题目 这四张表

版本表:ID、名称

教材表:ID、版本ID、名称

章节表:ID、教材ID、上级ID、层级、名称

题目表:ID、章节ID1级、章节ID2级、章节ID3级、…、题目类型、题目内容、答案内容

章节不是分类,分类也一般没有必要搞“无限”级。所以建议固定章节层级,分成不同的字段存到文章表即可。章节表可以通过上级ID来便于调整和查询层级关系。

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!