MySQL 没有 ID 的数据库关系

MySQL database relationship without an ID

嗨,Whosebug 社区,

我有这两个表:

tbl_users

tbl_posts

为什么每个人都用外键建立数据库关系?如果我想将 UsernameOwner 关联起来,而不是在两个表中都将 ID_user 与 ID_user 关联起来呢?

用户名是唯一的,所有者是post创建者的用户名。

这样可以吗?有什么可以纠正或改进的吗?可能是我理解错了

我希望得到详细且易于理解的答案。

提前致谢。

主要是为了数据的完整性。关于性能的论点有点误导。虽然既不详尽也不明确,但我希望这个小例子能说明这一事实:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table 
(i INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,s CHAR(12) NOT NULL UNIQUE
);

STEP1:

INSERT IGNORE INTO my_table (s) 
SELECT CONCAT(CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97)
             ,CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97)
             );

STEP2:

INSERT IGNORE INTO my_table (s) 
SELECT CONCAT(CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97)
             ,CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97),CHAR((RAND()*26)+97)
             )
  FROM my_table;

[REPEAT STEP 2 SEVERAL TIMES]

SELECT COUNT(*) FROM my_table;
  +----------+
  | COUNT(*) |
  +----------+
  |    16384 |
  +----------+
  1 row in set (0.01 sec)

 SELECT * FROM my_table ORDER BY i LIMIT 12;;
  +----+------------+
  | i  | s          |
  +----+------------+
  |  1 | kkxeehxsvy |
  |  2 | iuyhrk{vaq |
  |  3 | ngpedelooc |
  |  4 | irkbyqgkhc |
  |  6 | yqkcifcxdz |
  |  7 | sgezlgvjjq |
  |  8 | blavbvxbnl |
  |  9 | wdbtqvgvgt |
  | 13 | pakzpbnhxr |
  | 14 | vpoy{gdwyd |
  | 15 | ezlhz{drwg |
  | 16 | ncwcwbpudh |
  +----+------------+

  SELECT * FROM my_table x JOIN my_table y ON y.i < x.i ORDER BY x.i,y.i LIMIT 1;
  +---+------------+---+------------+
  | i | s          | i | s          |
  +---+------------+---+------------+
  | 2 | iuyhrk{vaq | 1 | kkxeehxsvy |
  +---+------------+---+------------+
  1 row in set (1 min 22.60 sec)

 SELECT * FROM my_table x JOIN my_table y ON y.s < x.s ORDER BY x.s,y.s LIMIT 1;
  +-------+------------+------+------------+
  | i     | s          | i    | s          |
  +-------+------------+------+------------+
  | 21452 | aabetdlvum | 6072 | aabdnegtav |
  +-------+------------+------+------------+
  1 row in set (1 min 13.59 sec)

所以,我们有两个查询在做基本相同的事情(比较 2.7 亿个值)。第一个将 table 连接到一个整数值上。第二个在字符串值上将 table 与其自身连接起来。两列都已编入索引。如您所见,在此示例中,字符串连接实际上比整数连接执行得更好 - 尽管 CPU 上的命中率实际上可能更大!