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

2021-02-18 09:33:06 +08:00
 vansl

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

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

主表

指标名称
指标 1

字段表

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

字段值表

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

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

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

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

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

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

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

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

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

© 2021 V2EX