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

时间:2011-03-17 18:45:18

标签: 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    |                |
+-----------------+--------------+------+-----+---------+----------------+

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

我的问题是,通过添加company_id来减少异常化是不好的 笔记表的外键?原因是我可以得到所有 公司的注释,其连接数少于当前模式。

或者用另一种方式提出问题:添加的优点和缺点是什么 一个冗余的company_id外键注释?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

去标准化的缺点(将company_id添加到notes表中):

  • 数据可能不同步
  • 它使用更多的磁盘空间

优点:

  • 加入更简单。有时这个 是一个很好的理由,例如:您可以通过将城市名称移动到“城市”表来规范化地址表。但我不会这样做,因为它会使很多查询复杂化,而且会使插入和更新复杂化,并且没有什么好处。有一种方法可以减少这种“增加的复杂性”问题:使用视图。
  • 在某些情况下,它可能会更快(这些情况很少见)。
  • 对于非常大的数据库,shard数据可能更容易。