Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 外键冗余_Mysql_Sql_Database_Foreign Keys_Rdbms - Fatal编程技术网

Mysql 外键冗余

Mysql 外键冗余,mysql,sql,database,foreign-keys,rdbms,Mysql,Sql,Database,Foreign Keys,Rdbms,我有三张桌子 使用者 文章 照片 我是否需要在表photo和user之间添加一个引用userid的外键,因为userid已经在photo\u article和article\u user组合外键中引用了?为什么?是的 您的photo\u文章外键仅强制执行photo和文章之间的完整性。它不强制用户的完整性 在用户和文章之间也没有外键 这意味着如果您有以下数据: 使用者 文章 照片 即使用户中不存在userid2(假设profiles中存在userid2),此数据仍然有效。不需要。一个外键声明表示引

我有三张桌子

使用者 文章 照片 我是否需要在表
photo
user
之间添加一个引用
userid
的外键,因为
userid
已经在
photo\u article
article\u user
组合外键中引用了?为什么?是的

您的
photo\u文章
外键仅强制执行
photo
文章
之间的完整性。它不强制
用户
的完整性

用户
文章
之间也没有外键

这意味着如果您有以下数据:

使用者 文章 照片 即使用户中不存在
userid
2(假设
profiles
中存在
userid
2),此数据仍然有效。

不需要。一个
外键
声明表示引用表中的子代码也必须在引用表中显示为唯一的子代码。强制执行您声明的将强制执行您未声明的

但是您可能想声明它,也可能不想声明它。可能不会。
photo
中每一行的含义类似于“用户
serid
subid
照片出现在他们的
articleid
文章中”。如果更改表
文章
用户
的含义,则应将其理解为RDBMS管理的一部分,即(除其他事项外)直接或传递引用它们的任何外键也可能需要更改


在明确程度与简洁程度之间,以及在当前和/或可能的变化下,冗余是否为正和/或负之间,始终存在工程权衡。

用户和文章之间也没有外键。。不,我有一个。你的问题中没有包括这个。如果您在
文章
用户
之间确实有外键,则在
照片
用户
之间不需要外键。最好还是显式创建外键,而不是依赖其他两个表之间的链接。外键实际上是在
语法中指定的。顺便问一下,为什么定义另一个外键更好?仅仅因为我发现它是多余的?我的意思是对开发人员来说更清晰,但正如我所说的,如果您在
文章
上设置了外键,则不需要它。我一定错过了什么。。。您的
文章
表格上的外键引用了
个人资料
表格而不是
用户
。很抱歉输入错误。无论如何,谢谢。你确定你要使用subid和articleid吗?对于每个表,当一行在其中时,它在列方面表示什么?
CREATE TABLE user(
    userid INT UNSIGNED AUTO_INCREMENT NOT NULL,
    name VARCHAR(100) NOT NULL,
    time DATETIME NOT NULL,
    PRIMARY KEY(userid),
) ENGINE=InnoDB;
CREATE TABLE article(
    userid INT UNSIGNED NOT NULL,
    subid INT UNSIGNED NOT NULL,
    content VARCHAR(1000) NOT NULL,
    time DATETIME NOT NULL,
    PRIMARY KEY(userid,subid),
    FOREIGN KEY article_user(userid) REFERENCES user(userid) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
CREATE TABLE photo(
    userid INT UNSIGNED NOT NULL,
    subid INT UNSIGNED NOT NULL,
    articleid INT UNSIGNED NOT NULL,
    name VARCHAR(255) NOT NULL,
    time DATETIME NOT NULL,
    PRIMARY KEY(userid,subid),
    FOREIGN KEY photo_article(userid,articleid) REFERENCES article(userid,subid) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
userid | name | time
-------|------|-----------------
1      | foo  | 1970-01-01 10:00
3      | bar  | 1970-01-01 12:00
userid | subid | content | time
-------|-------|---------|-----------------
1      | 1     | lorem   | 1970-01-01 10:15
2      | 2     | ipsum   | 1970-01-01 11:15
3      | 3     | dolor   | 1970-01-01 12:15
userid | subid | articleid | name | time
-------|-------|-----------|------|-----------------
1      | 1     | 1         | foo  | 1970-01-01 10:30
2      | 2     | 2         | bar  | 1970-01-01 11:30