MySQL数据库模式创建者&老板关系?例如用户&媒体?

时间:2018-02-02 07:51:05

标签: mysql database database-design schema mysql-workbench

如果两个表之间存在创建者和所有者关系,那么将两个表链接在一起的最佳方法是什么?例如,用户创建媒体文件条目。用户可选地具有图像/媒体文件作为简档图片。我用MySQL Workbench构建了一个模式。但这样做并不起作用。其他表:项目有一个或多个错误,错误有一个或多个注释。两个错误的注释都可以有一个或多个图像/媒体文件。谢谢!

Mysql workbench wrong database schema

1 个答案:

答案 0 :(得分:1)

<强>首先
根据您的解释,您的数据库设计应该是这样的(UML表示法):

enter image description here

  

用户创建媒体文件条目。

所以你有creator_user_id作为F.K进入media不能null,每个媒体都应该有一个创作者。

  

用户可选将图片/媒体文件作为个人资料图片。

因此,您在用户和媒体之间建立了一对一的关系。您有两种选择:

  1. 将用户ID作为F.K移至媒体profile_user_id并将其设为Allow NULLUnique
  2. 将媒体ID作为F.K移至用户profile_media_id并将其设为Allow NULLUnique
  3. 两者都是正确的。

    例如(第二个选项),您可以将profile_media_id作为F.K加入user可以成为null应为unique。表示media只能出现在一个用户个人资料中。

    这种设计(第二种选择)没错。它看起来是循环引用。但是,当您添加具有个人资料图片的新用户(同时)时,您应该在一个交易中执行这些操作:

    1. 创建用户(并让profile_media_id成为null
    2. 使用新的creator_user_id
    3. 创建媒体
    4. 更新新用户profile_media_id

    5. 其次
      你设计的第二部分(媒体与帖子和bug之间的关系)看起来很不错。 (根据你的解释)

      但是,我为他们设计了一个完整的外部媒体管理系统(参见我的回答here)。

      修改

      您可以使用以下内容创建表格:

      SET FOREIGN_KEY_CHECKS=0; 
      DROP TABLE IF EXISTS myuser;
      SET FOREIGN_KEY_CHECKS=1;
      
      CREATE TABLE myuser(
          user_id INT NOT NULL,
          profile_media_id INT DEFAULT NULL,
          PRIMARY KEY (user_id)
      );
      
      DROP TABLE IF EXISTS mymedia;
      CREATE TABLE mymedia(
          media_id INT NOT NULL,
          creator_user_id INT NOT NULL,
          PRIMARY KEY (media_id),
          FOREIGN KEY (creator_user_id) REFERENCES myuser (user_id),
          UNIQUE (creator_user_id)
      );
      
      ALTER TABLE myuser ADD CONSTRAINT myusermymediafk FOREIGN KEY (profile_media_id) REFERENCES mymedia (media_id);
      

      MySQL test here