V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ldehai
V2EX  ›  程序员

调查问卷数据库设计

  •  
  •   ldehai ·
    ldehai · 2015-09-17 21:40:38 +08:00 · 7901 次点击
    这是一个创建于 3362 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为每道题答案选项个数不一致,有的还是多选。这种是用关系数据库建多个表好,还是用 mongodb 建一个表搞定?一道题一条记录。
    19 条回复    2015-09-18 10:00:30 +08:00
    miemiekurisu
        1
    miemiekurisu  
       2015-09-17 21:48:45 +08:00 via Android   ❤️ 1
    不违反三范式的前提下,感觉题目横表,选项和用户答案纵表。
    当然也可以 mongodb 一个 document 搞定。
    ljbha007
        2
    ljbha007  
       2015-09-17 21:56:49 +08:00   ❤️ 3
    forms
    ====
    id int (pk )
    userId int (fk )
    title varchar
    description varchar

    questions
    =====
    id int (pk )
    form_id int (fk )
    question varchar
    answer_type enum (multi_choice, single_choice, text )

    choices
    =====
    id int (pk )
    question_id int (fk )
    description varchar

    text_answers
    ======
    id int (pk )
    session_id int
    question_id int (fk )
    content varchar

    choice_answers
    =======
    id int (pk )
    session_id int
    question_id int (fk )
    choice_id int

    大概这个样子
    根据问题表的 answer_type 判断时多选、单选还是 文字回答

    1. 单选、多选都去 choices 表查选项 只是前端控件不一样
    用户填完就插入到 choice_answers

    2. 文字回答就直接插入到 text_answers 里

    大概就是这样
    Mirana
        3
    Mirana  
       2015-09-17 22:01:34 +08:00   ❤️ 1
    mongo 的应用场景不就在这吗
    ldehai
        4
    ldehai  
    OP
       2015-09-17 22:06:05 +08:00
    @miemiekurisu 题目表和答案表还好,就是选项表看得不爽。
    @ljbha007 谢谢,好详细,表都不用我设计了。关系数据库就是查询的时候要多表关联,比 N OSQL 的要麻烦。
    ljbha007
        5
    ljbha007  
       2015-09-17 22:09:05 +08:00
    @ldehai 你用 mongodb 这种很多时候也需要表间关联的 不然效率很低
    ldehai
        6
    ldehai  
    OP
       2015-09-17 22:09:15 +08:00
    @Mirana 因为对 mongodb 不熟,看了介绍感觉比较合适。插入、更新、查询应该没问题。就担心统计麻烦。
    ljbha007
        7
    ljbha007  
       2015-09-17 22:11:51 +08:00
    @ldehai 有些字段还得根据需求加上或者去掉
    ldehai
        8
    ldehai  
    OP
       2015-09-17 22:13:50 +08:00
    @ljbha007 明白,谢谢
    ljbha007
        9
    ljbha007  
       2015-09-17 22:15:52 +08:00
    @ldehai mongodb 遇到多对一关系的时候最好还是另外建集合来放 然后手动关联过来 不然也会影响查询效率 不要用数组
    ljbha007
        10
    ljbha007  
       2015-09-17 22:23:08 +08:00
    @ldehai

    下面两种都是一对多关系 但是会根据情况直接 embed 进去还是用集合间关联

    http://docs.mongodb.org/master/tutorial/model-referenced-one-to-many-relationships-between-documents/

    http://docs.mongodb.org/master/tutorial/model-embedded-one-to-many-relationships-between-documents/

    主要是下面两个判断准则

    1. 如果把“一”的 document 嵌入到多个“多”的 document 中时发生的冗余是否可以接受
    2. “多”的 document 是否需要 再整个集合中而非单个 document 中进行条件查询、排序等操作
    ldehai
        11
    ldehai  
    OP
       2015-09-17 22:24:34 +08:00
    @ljbha007 兄弟很有经验,主要是想存题目简单点,现在的业务多对一的情况不多。
    keithsun80
        12
    keithsun80  
       2015-09-17 22:59:36 +08:00
    @ljbha007 mongoDB 不做关联, 直接存储对应结构
    问卷
    [题 1 , 2 , 3 ,……… ]
    keithsun80
        13
    keithsun80  
       2015-09-17 23:00:03 +08:00
    mongoDB 尽可能冗余
    ljbha007
        14
    ljbha007  
       2015-09-17 23:18:25 +08:00
    @keithsun80 他这个情况是没有必要 有些情况应该做关联 比如我发那个链接的第一种
    keithsun80
        15
    keithsun80  
       2015-09-17 23:26:11 +08:00
    @ljbha007 学习了,谢谢。
    orvice
        16
    orvice  
       2015-09-17 23:55:58 +08:00
    mongo 吧
    如果需要统计新增记录的时候顺便统计
    oojiayu
        17
    oojiayu  
       2015-09-17 23:59:45 +08:00
    去看看问卷星不就 OK 了吗?
    问卷星已经做得很完善了~ 基本很少有同行可以超越~
    EyreFree
        18
    EyreFree  
       2015-09-18 09:54:10 +08:00
    ....

    https://mart.coding.net/p/109

    是这个么, 2333

    QAQ
    ldehai
        19
    ldehai  
    OP
       2015-09-18 10:00:30 +08:00
    @EyreFree 想多了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2550 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:06 · PVG 13:06 · LAX 21:06 · JFK 00:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.