没有ID的MySQL数据库关系

时间:2015-05-09 11:34:26

标签: mysql sql database phpmyadmin relation

您好StackOverflow社区,

我有这两个表:

tbl_users

  • ID_user( PRIMARY KEY
  • 用户名 UNIQUE
  • 密码
  • ...

tbl_posts

  • ID_post( PRIMARY KEY
  • 所有者 UNIQUE
  • 描述
  • ...

为什么每个人都总是与外键建立数据库关系?如果我想将用户名所有者相关联,而不是在两个表中使用ID_user进行ID_user,那该怎么办?

用户名是UNIQUE,所有者是帖子创建者的用户名。

可以这样做吗?有什么可以纠正或改善?也许我有一种误解。

我很欣赏详细而易懂的答案。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

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亿个值)。第一个将表连接到整数值上。第二个将表连接到字符串值。两列都已编入索引。正如您所看到的,在此示例中,字符串连接实际上比整数连接执行得更好 - 即使CPU上的命中实际上可能更大!