0

我有这个表定义。

 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 表上使用它有什么性能差异吗?

4

2 回答 2

1

一方面,您的命名约定不好。我希望密钥被命名为:

KEY `Part1_2` (`Part1`,`Part2`),
KEY `Part1` (`Part1`),

Part1在任何情况下,都不需要唯一拥有的密钥。复合键(Part1,Part2)可以在任何需要使用的地方Part1使用。

于 2013-08-08T20:56:36.333 回答
1

有人可以解释一下为什么密钥“Part1”包含 Part1 和 Part2,这有什么好/坏的一面?

据我所知,这只是一个糟糕的命名。就性能和数据完整性而言,这里的名称并不重要。如果您以后需要按名称删除它可能会很麻烦。

就像 Gordon Linoff 所说,您问题中名为“Part1_2”的键可以删除。

在 Part1/Part2 上使用 FK 会更好吗?

这些列中的任何一列都没有唯一约束。MySQL仍然允许您使用外键引用它们,但 MySQL 文档告诉您不要这样做。(允许这是一个错误;记录它比修复它更容易。)

MySQL 中的key并不意味着它在其他 SQL dbms 中的含义。在这个CREATE TABLE 语句中,KEY 是 INDEX 的同义词;它不是 UNIQUE 的同义词,也不是 PRIMARY KEY 的简写。该表中唯一可以被外键约束安全引用的列是 fID。

在 MyISAM 和 InnoDB 表上使用它有什么性能差异吗?

InnoDB 支持行级锁定、事务和外键约束。MyISAM 没有。在考虑性能差异之前,我会担心这些差异。如果您的数据库给您错误的答案,它的运行速度并不重要。

于 2013-08-09T03:20:25.900 回答