【问题标题】:MySQL database schema creator & owner relationship? For example user & media?MySQL数据库模式创建者和所有者关系?例如用户和媒体?
【发布时间】:2018-07-12 16:23:15
【问题描述】:

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

【问题讨论】:

  • 一个媒体可以用在一个bug或一个评论中吗?或者它也可以用于许多 bug 或 cmets?
  • 一开始没有计划媒体库。但在未来,我认为你可以在 bug 和 cmets 中重用媒体是有意义的。所以我在这里使用了 n:m 关系。但不知道如何实现用户媒体关系。

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


【解决方案1】:

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

用户创建媒体文件条目。

所以你有一个 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

两者都是正确的。

例如(第二个选项),您可以将 profile_media_id 作为 F.K 转换为 user。它可以null但是应该是unique。表示media 只能出现在一个用户配置文件中。

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

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


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

不过,我愿意为他们设计一个完整的外部媒体管理系统(请参阅我的回答 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

【讨论】:

  • 你好 Gholamali-Irani,我在我的 MariaDB 上尝试过这种方式(Xampp 通过 phpMyAdmin 导入)。但是这里的 create table 语句发出错误:Can't create table dbname.user (Fehler: 150 "Foreign key constraint is wrongly forms")。在附近的数据字典中找不到引用的表dbname.media。所以我不能创建这个模式,因为存在互惠关系。 MySQL / MariaDB 是否有其他干净的方法 - 或者我必须使用 n:m 模式或删除创建者用户日志字段?
  • 请看添加的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多