我有以下(简化的)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外键有哪些优缺点?
不要这样做.MySQL对连接非常聪明.理论上看起来很多工作往往最终会非常有效地完成.使用explain
,如果你不能确定查询将多少工作产生.
为了节省输入连接是一个非常糟糕的理由来反规范化数据库.