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