MySQL数据库模式创建者&;所有者关系?例如,用户&;媒体

MySQL数据库模式创建者&;所有者关系?例如,用户&;媒体,mysql,database,database-design,schema,mysql-workbench,Mysql,Database,Database Design,Schema,Mysql Workbench,如果两个表之间存在创建者和所有者关系,那么将它们链接在一起的最佳方式是什么?例如,用户创建媒体文件条目。用户可以选择将图像/媒体文件作为配置文件图片。我已经用MySQL工作台构建了一个模式。但那样做是行不通的。其他表格:一个项目有一个或多个bug,一个bug有一个或多个注释。两个bug和注释都可以有一个或多个图像/媒体文件。谢谢 首先: 根据您的解释,您的数据库设计应该如下(UML表示法): 用户创建媒体文件条目 所以你有一个创建者\用户\ id作为F.K进入媒体。它不能为null,每个媒体都

如果两个表之间存在创建者和所有者关系,那么将它们链接在一起的最佳方式是什么?例如,用户创建媒体文件条目。用户可以选择将图像/媒体文件作为配置文件图片。我已经用MySQL工作台构建了一个模式。但那样做是行不通的。其他表格:一个项目有一个或多个bug,一个bug有一个或多个注释。两个bug和注释都可以有一个或多个图像/媒体文件。谢谢


首先
根据您的解释,您的数据库设计应该如下(UML表示法):

用户创建媒体文件条目

所以你有一个
创建者\用户\ id
作为F.K进入
媒体
。它不能
null
,每个媒体都应该有一个创建者

用户可以选择将图像/媒体文件作为配置文件图片

所以用户和媒体之间有一对一的关系。您有两个选择:

  • 将用户id作为F.K移动到媒体作为
    profile\u user\u id
    ,并将其设置为
    Allow NULL
    Unique
  • 将媒体id作为F.K移动到用户作为
    profile\u media\u id
    ,并将其设置为
    Allow NULL
    Unique
    两者都是正确的

    例如(第二个选项),您可以将
    配置文件\u media\u id
    作为F.K导入
    用户
    。它可以
    null
    但是它应该是唯一的。意味着
    媒体
    只能出现在一个用户配置文件中

    这种设计(第二种选择)没有错。它看起来是一个循环引用。但是,当您使用配置文件映像添加新用户时(同时),您应该在一个事务中执行这些操作:

  • 创建一个用户(并将
    配置文件\u媒体\u id
    设置为
    null
  • 使用新的
    creator\u user\u id创建媒体
  • 更新新用户
    profile\u media\u id

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

    然而,我为他们设计了一个完整的外部媒体管理系统(见我的答案)

    编辑 您可以使用以下方法创建表:

    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);
    

    可以在一个bug或一条评论中使用媒体吗?或者它也可以用于许多bug或注释?起初,没有计划使用媒体库。但在将来,我认为可以在bug和评论中重用媒体是有意义的。所以我在这里使用了n:m关系。但我不知道如何实现用户与媒体的关系。你好,Gholamali Irani,我在我的MariaDB(通过phpMyAdmin导入的Xampp)上尝试了这种方式。但是在这里,CREATETABLE语句发出了一个错误:无法创建表
    dbname
    user
    (Fehler:150“外键约束格式不正确”)。在附近的数据字典中找不到引用的表
    dbname
    media
    。所以我不能创建这个模式,因为存在互惠关系。MySQL/MariaDB还有其他干净的方法吗?或者我必须使用n:m模式或删除creator用户日志字段吗?请参见添加的示例。