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