关于 mysql 数据库设计上的疑惑

2019-01-26 20:22:13 +08:00
 lynnjyu

想请教各位大佬,最近做毕业设计, 设计数据库的时候遇到一种场景,现在有 a b 两个实体 他们都可以发布活动 ,关系都是 1 对多 而且活动的字段都一样

a(id,name,...) b(id,name,...) activity(id,content,time,...)

但是我不知道 activity 是设计成两个表 a_activity ( id,content,time,a_id ) b_activity ( id,content,time,b_id )

还是设计成一个表 然后用 type 区分 activity ( id,content,time,a_or_b_id,type,...) 因为总感觉两个表有点重复

从数据库设计的原则上来考虑,怎么做才是最优的呢?

4080 次点击
所在节点    MySQL
14 条回复
kanezeng
2019-01-26 20:29:34 +08:00
a 和 b 应该属于一个表,比如 shiti ?然后 activity 表有个 shiti_id ?
rogwan
2019-01-26 20:31:31 +08:00
activity 设计成一个表,在加一个关系表连接实体。
joooooker21
2019-01-26 20:34:06 +08:00
如果 a,b 两个实体属性一致,无需设置两个表. 如果要进行区分,可以增加字段 role_id
lynnjyu
2019-01-26 20:38:16 +08:00
@kanezeng
@rogwan
@joooooker21
a 和 b 是完全不同的实体,但是他们都是可以发布活动的,发布出来的活动的字段是一致的,activity 如果设计成一个表本来如果是只有一个实体 a 跟活动关联,那就加一个 a_id 就好了 ,问题是现在还要多一个 b_id,所以我想在 activity 加一个 type 来区分这个外部实体 id 是 a_id 还是 b_id, 但是不知道这样设计好不好
qiayue
2019-01-26 20:43:05 +08:00
两种方法都行
数据量少,就一个活动表,加字段区分
数据量大了,需要分表分库了,就分成 2 个表
lhx2008
2019-01-26 20:54:44 +08:00
还是要从实际意义层面分析,两个表如果意义不同,那可能到时候一个表会加列,另一个表不加,不保持同步的话,建议就分开。如果这两个表永远同步的话,那可以考虑合并,包括 a,b 也可以考虑合并。
kanezeng
2019-01-26 21:09:47 +08:00
@lynnjyu 你这提供的信息还是比较模糊啊,比如说一个 bbs,也可以说:a 和 b 是完全不同的用户,但是他们都是可以发布帖子的,发布出来的帖子的字段是一致的。。。。
可是这种情况没人会给每个用户单独建一个表,只会有一个 user 表,然后帖子表里有 user_id 不是
guokeke
2019-01-26 21:11:30 +08:00
业务需要 join 表查询的话就做成一张表
kanezeng
2019-01-26 21:11:50 +08:00
如果你是两类用户,那就是 user 表加一列 shiti_id,表明每个用户属于哪个实体。不要在 activity 表处理,因为你以后这两类用户可能不止发 activity,还可能发消息,还可能发附件,可能发很多,应该针对人来区分,而不是发出来的东西。
guokeke
2019-01-26 21:11:56 +08:00
我的意思是能不 join 表就别 join
lynnjyu
2019-01-26 21:31:15 +08:00
@qiayue
@lhx2008
@kanezeng
@guokeke
@joooooker21
@rogwan
Get 到了,谢谢各位大佬!非常感谢!
jason19659
2019-01-26 23:46:15 +08:00
应该是 a 和 b 设计成一个表。如果改不了了,那 activity 就得两个
jingyulong
2019-01-27 01:31:31 +08:00
关系型数据库,设计时主要从关系出发。a 表和 b 表共同的部分可以单独设计一张表,如果字段不多,就不用这么做。减少 join 可以考虑冗余常用的字段。总感觉你这个要做成多对多的关系,type 与 a 和 b 之间的关系还要好好想想,仅仅用来做区分感觉不太合适。如果确定是一一对应的,那么就用 type 来区分。如果是多对多的关系,就要用关系表来链接。不知道你的业务逻辑复不复杂,能简单就按简单的来做,复杂的可以考虑我这种。
jssyxzy
2019-01-27 16:38:00 +08:00
第一种。

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

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

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

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

© 2021 V2EX