V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
lynnjyu
V2EX  ›  MySQL

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

  •  
  •   lynnjyu · 2019-01-26 20:22:13 +08:00 · 4165 次点击
    这是一个创建于 2119 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想请教各位大佬,最近做毕业设计, 设计数据库的时候遇到一种场景,现在有 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,...) 因为总感觉两个表有点重复

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

    14 条回复    2019-01-27 16:38:00 +08:00
    kanezeng
        1
    kanezeng  
       2019-01-26 20:29:34 +08:00
    a 和 b 应该属于一个表,比如 shiti ?然后 activity 表有个 shiti_id ?
    rogwan
        2
    rogwan  
       2019-01-26 20:31:31 +08:00 via Android
    activity 设计成一个表,在加一个关系表连接实体。
    joooooker21
        3
    joooooker21  
       2019-01-26 20:34:06 +08:00
    如果 a,b 两个实体属性一致,无需设置两个表. 如果要进行区分,可以增加字段 role_id
    lynnjyu
        4
    lynnjyu  
    OP
       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
        5
    qiayue  
       2019-01-26 20:43:05 +08:00
    两种方法都行
    数据量少,就一个活动表,加字段区分
    数据量大了,需要分表分库了,就分成 2 个表
    lhx2008
        6
    lhx2008  
       2019-01-26 20:54:44 +08:00
    还是要从实际意义层面分析,两个表如果意义不同,那可能到时候一个表会加列,另一个表不加,不保持同步的话,建议就分开。如果这两个表永远同步的话,那可以考虑合并,包括 a,b 也可以考虑合并。
    kanezeng
        7
    kanezeng  
       2019-01-26 21:09:47 +08:00
    @lynnjyu 你这提供的信息还是比较模糊啊,比如说一个 bbs,也可以说:a 和 b 是完全不同的用户,但是他们都是可以发布帖子的,发布出来的帖子的字段是一致的。。。。
    可是这种情况没人会给每个用户单独建一个表,只会有一个 user 表,然后帖子表里有 user_id 不是
    guokeke
        8
    guokeke  
       2019-01-26 21:11:30 +08:00 via Android
    业务需要 join 表查询的话就做成一张表
    kanezeng
        9
    kanezeng  
       2019-01-26 21:11:50 +08:00
    如果你是两类用户,那就是 user 表加一列 shiti_id,表明每个用户属于哪个实体。不要在 activity 表处理,因为你以后这两类用户可能不止发 activity,还可能发消息,还可能发附件,可能发很多,应该针对人来区分,而不是发出来的东西。
    guokeke
        10
    guokeke  
       2019-01-26 21:11:56 +08:00 via Android
    我的意思是能不 join 表就别 join
    lynnjyu
        11
    lynnjyu  
    OP
       2019-01-26 21:31:15 +08:00
    @qiayue
    @lhx2008
    @kanezeng
    @guokeke
    @joooooker21
    @rogwan
    Get 到了,谢谢各位大佬!非常感谢!
    jason19659
        12
    jason19659  
       2019-01-26 23:46:15 +08:00
    应该是 a 和 b 设计成一个表。如果改不了了,那 activity 就得两个
    jingyulong
        13
    jingyulong  
       2019-01-27 01:31:31 +08:00 via iPhone
    关系型数据库,设计时主要从关系出发。a 表和 b 表共同的部分可以单独设计一张表,如果字段不多,就不用这么做。减少 join 可以考虑冗余常用的字段。总感觉你这个要做成多对多的关系,type 与 a 和 b 之间的关系还要好好想想,仅仅用来做区分感觉不太合适。如果确定是一一对应的,那么就用 type 来区分。如果是多对多的关系,就要用关系表来链接。不知道你的业务逻辑复不复杂,能简单就按简单的来做,复杂的可以考虑我这种。
    jssyxzy
        14
    jssyxzy  
       2019-01-27 16:38:00 +08:00
    第一种。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2812 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:42 · PVG 19:42 · LAX 03:42 · JFK 06:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.