首页   注册   登录
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
宝塔
V2EX  ›  MySQL

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

  •  
  •   lynnjyu · 296 天前 · 2155 次点击
    这是一个创建于 296 天前的主题,其中的信息可能已经有所发展或是发生改变。

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