大家看看这个数据表怎么设计最简单?
发现组卷网的这个选题有点厉害,单独的无限级分类,只要选择子级,将父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)
这样虽然可以实现功能,那如果我今天,又想增加一个新的分类表呢?不能所有文章编辑一遍吧,当然也可以跑个脚本,所有文章自动改一遍。
不知道大家有什么更好的想法没?
如果你想继续问,请告诉我你对于这个表结构的想法以及你认为这个表结构为什么这么设计,这是一个年代比较久远项目的表。 当时是用来做分销等级和无限级设定的。
是不是可以理解为:同一篇文章,可以从属于不同的分类?
如果是这类问题的话,就不能在文章这一维度记录所属的分类了,需要单独建一个表进行关联,表结构大致如下:
在分类表上,我一般会单独加两个层级相关的字段:
这样在处理多级分类的时候,就不需要通过遍历查询了,效率有所提升。
这样设计的话,可以通过文章反向查询到所有从属的分类,也可以通过分类查到下面所有的文章。
关于无限分类,你可以搜索下
预排序遍历树
,也即MPTT
虽然比 id pid 复杂,但是处理无限级树形结构非常合适。首先是 tree 表格数据,然后 分类数据,随后 内容数据,中包含 tree数据最小节点id 以及分类id。 或者采用。es 直接搜索,完美解决你的问题。
这是两套分类。
一个是多级分类,一个是标签分类。
顶端和左侧的是一个多级分类。用于章节选题。
题目列表上面的内容是标签分类,用于知识点选题。
从链接格式也能看出是怎样构造的。
递归,简单方便,而且新增分类你怎么知道这类知识点是属于这章(分类)的,这种情况大多数都是人工处理(我觉得),脚本也没这么智能。除非补上一个额外知识点的分类,这个分类关联题目和(章节)分类
根据我看“组卷网”之后,个人有个想法:
整个设计分为三个模块:教材表(无限极分类),文章表、标签表
其中:
教材表关联标签表 (1:N),其中如果子集关联的标签必然也关联父级
文章表关联标签表(1:N),
这时候新建或者编辑的教程表中的任何级别,只要打上这标签,就能关联有这标签的文章...
盲猜设计分为:版本、教材、章节、题目 这四张表
版本表:ID、名称
教材表:ID、版本ID、名称
章节表:ID、教材ID、上级ID、层级、名称
题目表:ID、章节ID1级、章节ID2级、章节ID3级、…、题目类型、题目内容、答案内容
章节不是分类,分类也一般没有必要搞“无限”级。所以建议固定章节层级,分成不同的字段存到文章表即可。章节表可以通过上级ID来便于调整和查询层级关系。