V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xided
V2EX  ›  数据库

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

  •  
  •   xided · 2 天前 · 1647 次点击

    需求是用户需要填写一个表单,这个表单是由多个字段的组成一个维度的数据的一个表单,表单上有 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  
       2 天前
    你要是用 pgsql ,直接存 json 。如果没有联表查或数据统计,你就存 mongodb 也可以
    NotLongNil
        10
    NotLongNil  
       2 天前
    @xided 看你的需求呢

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

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

    如果查询时不会关心具体的属性,那肯定是所有值用一个 json 方便。
    如果你的类型是有限的几个,那完全可以每个类型建一张表。
    如果这些数据都是整体取出来用,那次表单存储一条数据也是可以的。
    Ketteiron
        12
    Ketteiron  
       2 天前
    @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  
       2 天前
    如果字段总量是确定的,那我选宽表方案,最简单好操作
    meshell
        14
    meshell  
       2 天前
    哈哈,OP 遇到和我一样的需求了。
    AlexBob
        15
    AlexBob  
       2 天前
    postgersql jsonb 字段存数据,关键字段做常规字段,比如 ID,创建人,创建时间,修改人,修改时间,扩展字段,编码,名称,再复杂就上 gis,求性能就上全文搜索,都是原生支持的
    Benjamin007
        16
    Benjamin007  
       2 天前
    短期快速上线优先推荐 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   ·   849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:38 · PVG 05:38 · LAX 14:38 · JFK 17:38
    ♥ Do have faith in what you're doing.