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

2021 年 2 月 18 日
 vansl

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

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

主表

指标名称
指标 1

字段表

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

字段值表

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

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

1931 次点击
所在节点    问与答
10 条回复
Slartibartfast
2021 年 2 月 18 日
这个要看查询需求,如果不需要反向查询,你的做法足够。否则就需要设计多对多表
Jacky23333
2021 年 2 月 18 日
mysql5.7 支持 json 类型了
xarthur
2021 年 2 月 18 日
愣是没看懂,这里的关系是什么?一对多、多对一还是多对多?
vansl
2021 年 2 月 18 日
@Slartibartfast 能用倒是能用,主要还是想知道实际生产中是怎样设计
vansl
2021 年 2 月 18 日
@Jacky23333 目前用的确实是 MySQL 的 json,上司要求迁移到 oracle 于是再找找有没有更好的方案
huobazi
2021 年 2 月 18 日
property property-values 这种经典画面,你那两种都能用,还有可以考虑直接存 json,这要看你的数据库是是否支持。

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

类似的问题比如树形结构,可以优雅的只存个 parentid,也可以规定 id 格式后,把祖先 id 全部都存到一个字段里,都具体要看你的场景了,
sytnishizuiai
2021 年 2 月 18 日
我现在用的第二种,虽然看表的时候比较繁琐不好找,但是 sql 语句查起来简单,好关联和统计,并且用户和部门可以后台方便设置(添删改)
vansl
2021 年 2 月 18 日
@xarthur 多对多吧,类似一个订单有多个购买人,把购买人字段存放到订单购买人表,但是不单单这个字段是这样的,其他字段也可以有多个值
vansl
2021 年 2 月 18 日
@huobazi
@sytnishizuiai
好的,感谢二位
iCong
2021 年 2 月 18 日
有查询需求建表,只展示就 json array 。我的做法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/753793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX