我有以下(简化的)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 | |
+-----------------+--------------+------+-----+---------+----------------+
公司有很多用户,用户有很多笔记。
我的问题是,通过添加company_id来减少异常化是不好的 笔记表的外键?原因是我可以得到所有 公司的注释,其连接数少于当前模式。
或者用另一种方式提出问题:添加的优点和缺点是什么 一个冗余的company_id外键注释?
答案 0 :(得分:6)
不要这样做。 MySQL对连接非常聪明。理论上看起来很多工作往往最终会非常有效地完成。如果您不确定查询将生成多少工作,请使用explain
。
为了节省输入连接是一个非常糟糕的理由来对数据库进行非规范化。
答案 1 :(得分:0)
去标准化的缺点(将company_id添加到notes表中):
优点: