我有这个表定义。
CREATE TABLE `friendship` (
`fID` bigint(20) NOT NULL AUTO_INCREMENT,
`Part1` bigint(20) NOT NULL DEFAULT '0',
`Part2` bigint(20) NOT NULL DEFAULT '0',
`AddedBy` bigint(11) NOT NULL DEFAULT '0',
`Accepted` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`fID`),
KEY `Part1` (`Part1`,`Part2`),
KEY `Part1_2` (`Part1`),
KEY `Part2` (`Part2`),
KEY `AddedBy` (`AddedBy`),
KEY `Accepted` (`Accepted`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
有人可以解释为什么关键" Part1"包含Part1和Part2,这有什么好/坏的一面? 在Part1 / Part2上使用FK更好吗?
在MyISAM和InnoDB表上使用它有什么性能差异吗?
答案 0 :(得分:1)
你有一个错误的命名约定,一方面。我希望键名为:
KEY `Part1_2` (`Part1`,`Part2`),
KEY `Part1` (`Part1`),
在任何情况下,都不需要只有Part1
的密钥。复合键(Part1,Part2)
可以在任何使用Part1
的地方使用。
答案 1 :(得分:1)
有人可以解释为什么键“Part1”包含Part1和Part2,以及 这有什么好/坏的一面?
据我所知,这只是错误的命名。就性能和数据完整性而言,这里的名称并不重要。如果您以后需要按名称删除它,可能会很麻烦。
就像戈登·林诺夫所说,你问题中名为“Part1_2”的密钥可以删除。
在Part1 / Part2上使用FK更好吗?
这些列中没有任何唯一约束。 MySQL 仍然允许你用外键引用它们,但MySQL文档告诉你不要这样做。 (允许这是一个错误;记录它比修复它更容易。)
MySQL中的Key 并不意味着它在其他SQL dbms中意味着什么。在此 CREATE TABLE语句中,KEY is a synonym for INDEX;它不是UNIQUE的同义词,也不是PRIMARY KEY的简写。此表中唯一可以由外键约束安全引用的列是fID。
在MyISAM和InnoDB上使用它有什么性能差异 表
InnoDB支持行级锁定,事务和外键约束。 MyISAM没有。在考虑性能差异之前,我会担心这些差异。如果您的数据库给出了错误的答案,它的运行速度并不重要。