这种分级一对多,且分级不平衡的模型该怎么设计表?

2017-05-10 09:16:15 +08:00
 abcbuzhiming
最近遇到一个很纠结的业务模型:
要给一个教师培训机构设计题库,题库里每道题都隶属某个分支,关键奇葩就是在这个分支的定义上,这个分支在业务上是如下定义的:
首先,分学段:幼儿,小学,初中,高中
学段下面,是一级学科,
幼儿:综合素质,保教技能
小学:综合素质,教育能力,专业技术能力
初中:综合素质,教学能力,专业技术能力
高中:综合素质,教学能力,专业技术能力

然后,在“专业技术能力”下,还分语文,数学,英语。。。。等等第二级学科,且,小学,初中,高中拥有的下级学科还不一样。但是综合素质,教育能力这些又没有第二级学科。

于是这种分级不平衡现象导致这个题库里的题目出现一个很尴尬的现象
有的题目,属于一级学科,而有的题目,则属于二级学科

当然我是可以把题库表建成这样

题目 id 题目名称 所属 1 级学科 所属 2 级学科

但是我总觉这似乎哪里不对劲,但是又说不出到底哪不对头。
请各位指点
3908 次点击
所在节点    MySQL
16 条回复
Muninn
2017-05-10 09:27:15 +08:00
专业技术能力下边如果没有直接的题,那么可以只对应末级节点啊。

学科在程序里做成一棵树就行了。参考无限扩展的机构设计。
jianzhiyao020
2017-05-10 09:34:22 +08:00
http://www.jianshu.com/p/49026d65c26e
这个方案应该能够类推相关解决方案
ivvei
2017-05-10 09:56:42 +08:00
没看出这个模型有什么问题啊…… 就直接按照你描述的建好啦,比如

题目 ID, 题目, 学段,一级学科,二级学科

没有二级学科的,可以视为二级学科为“没有”。

单纯存储这样的结构毫无问题。具体的还得看你是怎么使用这些数据,用起来是不是方便。
abcbuzhiming
2017-05-10 10:19:07 +08:00
@jianzhiyao020
@ivvei
其实你们两个的想法我都考虑过,一个就是树,一个不是树,有限级别,我现在就是在权衡我这个“分级”到底改起来到底麻烦不麻烦。比如说如果万一标准变了,某个学科不存在了,对应的题目要转移到新学科去,变动是否很大
gamexg
2017-05-10 10:19:46 +08:00
学科表
id 名称 上级学科

题目表
id 题目名称 题目所属学科

现在是 2 级学科可以用“所属 1 级学科 所属 2 级学科 ”,但是下次如果再增加个三级学科,难道要修改表结构?
tabris17
2017-05-10 10:21:44 +08:00
简单的树状结构,有什么问题?

如果要能按照节点查找所有字节点,可以使用左右值结构
reus
2017-05-10 10:25:54 +08:00
学科合并成一级不就行了。
综合素质,教育能力,语文,数学,英语……
业务模型又不用对应到数据库模型。数据库里就一级学科,业务里需要区分出一级二级时再另外处理下。
sunriseyuen
2017-05-10 10:30:20 +08:00
用标签的模型应该可以
reus
2017-05-10 10:31:09 +08:00
树不用存到数据库里,直接在代码里写,也不会经常改动的。需要用到树时,从数据库读出来再生成。
用关系数据库存树,各种方式都有优缺点,麻烦得很。你这种父子关系不经常变动的,写在代码里,要改时才改代码就行。
abcbuzhiming
2017-05-10 10:37:50 +08:00
@sunriseyuen 标签的模型是什么?
ivvei
2017-05-10 10:46:13 +08:00
@abcbuzhiming 标签就是 tag 那种。适合有多种分类方式并且级别不明显的,不适合你这种分类方式唯一确定且级别层次明显的。
jianzhiyao020
2017-05-10 10:48:50 +08:00
@abcbuzhiming
其实还好啦,
用户对读是敏感的,
但是写是可以异步的,
可以走个异步队列去修改相关的题目或者分类,
修改步骤很简单,
但是索引的重建在数据量大的情况下需要考虑,
我们现在场景数据是千亿级别的,
都是用 linux 目录形式做索引,
索引应该问题不是很大。
halfcoder
2017-05-10 10:54:15 +08:00
最直接的想法:按无限分类来做
sunriseyuen
2017-05-10 11:06:22 +08:00
@abcbuzhiming 一个题可归为一年级,或是高中
CYKun
2017-05-10 11:37:54 +08:00
同意 7 楼的想法,具体来说就是:

学科表:
id 学科名称 父学科 id

题目表:
id 题目名称 学科 id
ideascf
2017-05-10 13:37:11 +08:00
学科表
id 名称 上级学科

题目表
id 题目名称

学科题目关系表
id 题目 id 学科 id

这样有几个好处:
1. 一个题目可以关联多个学科
2. 学科 删除或修改 不影响题目表
坏处:
表多一些,查询的时候需要做 join

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360281

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX