V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
vansl
V2EX  ›  问与答

请问一个实体的多个字段可能有多个值,应该怎么设计数据库?

  •  
  •   vansl · 2021-02-18 09:33:06 +08:00 · 1362 次点击
    这是一个创建于 1365 天前的主题,其中的信息可能已经有所发展或是发生改变。

    像下面这样,一个表中的好几个字段是有多个值的: yRMOs0.png

    目前的存储方式是把外键 id 列表用逗号分隔,直接存储在表里,总感觉不太优雅。 另外想到的一种方式是字段存一个表,字段值存一个表,像这样:

    主表

    指标名称
    指标 1

    字段表

    字段名称 字段类型(用户 /部门)
    责任用户 1 用户
    责任部门 1 部门

    字段值表

    外键主表 id 外键字段表 id 字段值
    1 1 测试用户 1
    1 1 测试用户 2
    1 2 测试部门 1
    1 2 测试部门 2

    没实际用过也不知道会有什么问题。请问各位遇到这种情况是怎么设计数据库的?

    10 条回复    2021-02-18 15:04:30 +08:00
    Slartibartfast
        1
    Slartibartfast  
       2021-02-18 10:30:24 +08:00 via iPhone
    这个要看查询需求,如果不需要反向查询,你的做法足够。否则就需要设计多对多表
    Jacky23333
        2
    Jacky23333  
       2021-02-18 10:31:20 +08:00 via Android
    mysql5.7 支持 json 类型了
    xarthur
        3
    xarthur  
       2021-02-18 10:53:29 +08:00
    愣是没看懂,这里的关系是什么?一对多、多对一还是多对多?
    vansl
        4
    vansl  
    OP
       2021-02-18 10:59:58 +08:00
    @Slartibartfast 能用倒是能用,主要还是想知道实际生产中是怎样设计
    vansl
        5
    vansl  
    OP
       2021-02-18 11:01:00 +08:00
    @Jacky23333 目前用的确实是 MySQL 的 json,上司要求迁移到 oracle 于是再找找有没有更好的方案
    huobazi
        6
    huobazi  
       2021-02-18 11:05:28 +08:00
    property property-values 这种经典画面,你那两种都能用,还有可以考虑直接存 json,这要看你的数据库是是否支持。

    想优雅那就看看 eav,其实吧,我觉得优雅还不一定用逗号来的舒服,具体要看你的场景,常用什么样的查询啊什么的。

    类似的问题比如树形结构,可以优雅的只存个 parentid,也可以规定 id 格式后,把祖先 id 全部都存到一个字段里,都具体要看你的场景了,
    sytnishizuiai
        7
    sytnishizuiai  
       2021-02-18 11:06:08 +08:00
    我现在用的第二种,虽然看表的时候比较繁琐不好找,但是 sql 语句查起来简单,好关联和统计,并且用户和部门可以后台方便设置(添删改)
    vansl
        8
    vansl  
    OP
       2021-02-18 11:07:51 +08:00
    @xarthur 多对多吧,类似一个订单有多个购买人,把购买人字段存放到订单购买人表,但是不单单这个字段是这样的,其他字段也可以有多个值
    vansl
        9
    vansl  
    OP
       2021-02-18 11:37:10 +08:00
    @huobazi
    @sytnishizuiai
    好的,感谢二位
    iCong
        10
    iCong  
       2021-02-18 15:04:30 +08:00
    有查询需求建表,只展示就 json array 。我的做法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1853 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:39 · PVG 00:39 · LAX 08:39 · JFK 11:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.