V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
abcbuzhiming
V2EX  ›  MySQL

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

  •  
  •   abcbuzhiming · 2017-05-10 09:16:15 +08:00 · 4088 次点击
    这是一个创建于 2779 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近遇到一个很纠结的业务模型:
    要给一个教师培训机构设计题库,题库里每道题都隶属某个分支,关键奇葩就是在这个分支的定义上,这个分支在业务上是如下定义的:
    首先,分学段:幼儿,小学,初中,高中
    学段下面,是一级学科,
    幼儿:综合素质,保教技能
    小学:综合素质,教育能力,专业技术能力
    初中:综合素质,教学能力,专业技术能力
    高中:综合素质,教学能力,专业技术能力

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    题目表
    id 题目名称

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

    这样有几个好处:
    1. 一个题目可以关联多个学科
    2. 学科 删除或修改 不影响题目表
    坏处:
    表多一些,查询的时候需要做 join
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3137 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:18 · PVG 21:18 · LAX 05:18 · JFK 08:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.