大佬们,请教一个数据库设计的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xided
V2EX    数据库

大佬们,请教一个数据库设计的问题

  •  
  •   xided 2 天前 1546 次点击

    需求是用户需要填写一个表单,这个表单是由多个字段的组成一个维度的数据的一个表单,表单上有 n 个这种维度的数据,这种数据库表设计应该如何设计好

    举个例子,描述一个长方体需要长宽高三个字段,表单里填了 长方体=>长:123 宽 234 高 345, 三角形=>第一个角 30 第二个角 40 第三个角 110 ,一次性提交表单后,表格会显示两条数据,但这两条数据属于一次填写

    类型 时间
    长方形 长 123 宽 234 高345 2025-10-11 11:11:11
    三角形 30° 40° 110° 2025-10-11 11:11:11

    我的想法是建一张宽表,包含所有维度的数据的字段(固定的),然后有一张字段映射表,配置宽表的哪些字段要组成独立的数据,新增完宽表记录后通过这张映射表,生成对应维度的一个数据,这种设计是否合理呢

    20 条回复    2025-10-18 15:55:33 +08:00
    NotLongNil
        1
    NotLongNil  
       2 天前
    有没有这种查询需求,查询指定长度范围的列?如果没有,直接丢一个字符串,字符串是个 json 。如果有,看看你的数据库对 json 的支持怎样
    Gilfoyle26
        2
    Gilfoyle26  
       2 天前
    直接存 json
    Ketteiron
        3
    Ketteiron  
       2 天前
    如果用不到复杂聚合查询,json 是最好方案。
    xided
        4
    xided  
    OP
       2 天前
    @Ketteiron #3
    @Gilfoyle26 #2
    @NotLongNil #1 json 存是指数据库表字段为 维度、对应值 json 对象 这样的嘛,复杂查询不会有,但需要基于这些数据渲染某几个维度的复合图表
    zepc007
        5
    zepc007  
       2 天前
    直接一个大 Json ,想怎么塞怎么塞
    cBlank
        6
    cBlank  
       2 天前
    值这一列直接存 JSON 就行了,查询数据的话量不大也是没问题的。
    Yanlongli
        7
    Yanlongli  
       2 天前
    如果需要根据值的内容进行查询,比如需要查询 类型=长方形 AND 长 = 123
    优选 MongoDB
    二嘛就是 JSON 了,支持查询的那种 {json 字段}.lOng=xxx
    三就是宽表结构了

    如果是不需要查询的就简单了,关系型数据库文本存进去即可
    长=123,宽=234


    你得先说你用的什么数据库、什么版本以及是否可以换其它数据库
    fortytwo
        8
    fortytwo  
       2 天前
    JSON 正解,其他方案需要频繁动数据库结构。非常麻烦。
    donaldturinglee
        9
    donaldturinglee  
       1 天前
    你要是用 pgsql ,直接存 json 。如果没有联表查或数据统计,你就存 mongodb 也可以
    NotLongNil
        10
    NotLongNil  
       1 天前
    @xided 看你的需求呢

    1. 如果你有复杂的查询统计需求,如果你有 mongodb ,存 mongodb 是最好的方案
    2. 如果你们的查询不复杂,如果你的数据库支持将表字段设置为 json 类型,先确认下该数据库的 json 查询 api 是否可以满足你的查询需求
    3. 如果需求只是简单的读写,你可以搞一个“字符串类型”的“数据库字段”用于存储,这个字段存储一个“json 格式”的字符串
    4. 如果你有复杂的查询统计需求,又没有 mongodb ,数据库对 json 的支持也达不到你的要求,那就“宽表”
    newtype0092
        11
    newtype0092  
       1 天前
    你的描述里只有数据长什么样(怎么存),如果只根据这个来设计数据结构那肯定是不靠谱的。

    你至少得考虑 怎么存,怎么取,将来会怎么迭代 才能确定合理的数据结构。

    如果查询时不会关心具体的属性,那肯定是所有值用一个 json 方便。
    如果你的类型是有限的几个,那完全可以每个类型建一张表。
    如果这些数据都是整体取出来用,那次表单存储一条数据也是可以的。
    Ketteiron
        12
    Ketteiron  
       1 天前
    @xided #4
    js
    const data1 = [
    {
    type: '长方形',
    value: { width: 100, height: 100, length: 200 },
    dateTime: '2025-01-01 12:00:00',
    },
    {
    type: '三角形',
    value: { angle1: 30, angle2: 60, angle3: 90 },
    dateTime: '2025-01-01 12:00:00',
    },
    ]

    const data2 = [
    {
    type: '长方形',
    width: 100,
    height: 100,
    length: 200,
    dateTime: '2025-01-01 12:00:00',
    },
    {
    type: '三角形',
    angle1: 30,
    angle2: 60,
    angle3: 90,
    dateTime: '2025-01-01 12:00:00',
    },
    ]
    ```
    有两种方案,看你自己选择了,我喜欢第一种。
    june4
        13
    june4  
       1 天前
    如果字段总量是确定的,那我选宽表方案,最简单好操作
    meshell
        14
    meshell  
       1 天前
    哈哈,OP 遇到和我一样的需求了。
    AlexBob
        15
    AlexBob  
       1 天前
    postgersql jsonb 字段存数据,关键字段做常规字段,比如 ID,创建人,创建时间,修改人,修改时间,扩展字段,编码,名称,再复杂就上 gis,求性能就上全文搜索,都是原生支持的
    Benjamin007
        16
    Benjamin007  
       1 天前
    短期快速上线优先推荐 mongodb 或者 JSON ,但长期需灵活查询、数据规范时,建议用“主表+子表”:主表存提交时间,子表存维度、字段名、值,灵活适配多维度,更稳定。最终还是和要求的高低有关。
    moioooo
        17
    moioooo  
       1 天前 via iPhone
    定义一列,为图形类型,第二列为图形参数,里面存 jaon
    facebook47
        18
    facebook47  
       1 天前 via Android
    这个主要是看数据是不是固定的,如果是动态的,用 json 最方便,而且可以任意改动,如果是固定的,可以一张主表,然后不同图形一张表,和主表关联即可,这种就比较笨了,但是可以直接对应每个图形对象
    dddz97
        19
    dddz97  
       1 天前
    差不多的需求,一开始用主表关联表方式开发,表建着建着就感觉太麻烦,最后还是用 json 存了一个大字段来处理了。
    qviqvi
        20
    qviqvi  
       1 天前
    可以一个表,加一列表单 id ,同 id 的是同一次填写
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2544 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 10:01 PVG 18:01 LAX 03:01 JFK 06:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86