是否可以对外键关系进行非规范化?

dan*_*dan 1 mysql sql join

我有以下(简化的)MySQL架构:

companies
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

users
+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| id                   | int(11)      | NO   | PRI | NULL    | auto_increment |
| email                | varchar(255) | NO   |     |         |                |
| username             | varchar(255) | NO   | UNI | NULL    |                |
| company_id           | int(11)      | YES  |     | NULL    |                |
| first_name           | varchar(255) | YES  |     | NULL    |                |
| last_name            | varchar(255) | YES  |     | NULL    |                |
| title                | varchar(255) | YES  |     | NULL    |                |
+----------------------+--------------+------+-----+---------+----------------+

notes
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id         | int(11)      | YES  |     | NULL    |                |
| title           | varchar(255) | YES  |     | NULL    |                |
| body            | text         | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

公司有很多用户,用户有很多笔记.

我的问题是,通过在notes表中添加company_id外键来减少异常化是不是很糟糕?原因是我可以获得一个公司的所有注释,其连接数少于当前模式.

或者用另一种方式提出问题:在笔记中添加冗余的company_id外键有哪些优缺点?

Ted*_*opp 6

不要这样做.MySQL对连接非常聪明.理论上看起来很多工作往往最终会非常有效地完成.使用explain,如果你不能确定查询将多少工作产生.

为了节省输入连接是一个非常糟糕的理由来反规范化数据库.