› 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 · Jan 26, 2019 · 4932 views
    This topic created in 2806 days ago, the information mentioned may be changed or developed.

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