Можно ли когда-нибудь денормализовать отношение внешнего ключа? - PullRequest
1 голос
/ 17 марта 2011

У меня есть следующая (упрощенная) схема 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 ]

6 голосов
/ 17 марта 2011

Не делай этого.MySQL очень умён в соединениях.То, что кажется теоретической работой, часто оказывается очень эффективным.Используйте explain, если вы не уверены в том, сколько работы сгенерирует запрос.

Экономить на вводе объединения - очень плохая причина для денормализации базы данных.

0 голосов
/ 17 марта 2011

Недостатки отмены нормализации (добавление company_id в таблицу заметок):

  • Данные могут быть не синхронизированы
  • Используется немного больше дискового пространства

Преимущества:

  • Соединения проще. Иногда это является хорошей причиной, например: вы можете нормализовать таблицу адресов, переместив название города в таблицу «городов». Но я бы не стал этого делать, потому что это усложнит множество запросов, плюс это усложнит вставки и обновления, и это мало что дает. Существует способ несколько уменьшить эту проблему «дополнительной сложности»: использование представления.
  • В некоторых случаях это может быть быстрее (такие случаи редки).
  • Для очень больших баз данных может быть проще осколок данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...