Внешний ключ null - снижение производительности - PullRequest
1 голос
/ 22 октября 2010

У меня есть папка таблицы, в которой столбец parent_id ссылается на идентификатор, если в этой папке есть родитель, если нет, то parent_id равен нулю. Это нормально, или мне нужна дополнительная таблица для этого соединения или другого решения? Может ли внешний ключ вообще быть нулевым, и если может, то это решение будет иметь большее время выполнения?

table folder(
   id int primary key,            //primary key in my table
   parent_id int references id,   //foreign key on id column in same table
....
)

Ответы [ 2 ]

4 голосов
/ 22 октября 2010

Да, внешний ключ может быть сделан для принятия NULL значений:

CREATE TABLE folders (
   id           int   NOT NULL   PRIMARY KEY, 
   parent_id    int   NULL, 
   FOREIGN KEY (parent_id) REFERENCES folders (id)
) ENGINE=InnoDB;
Query OK, 0 rows affected (0.06 sec)

INSERT INTO folders VALUES (1, NULL);
Query OK, 1 row affected (0.00 sec)

На время выполнения не влияет, если внешний ключ установлен для приема значений NULL или нет.


ОБНОВЛЕНИЕ: Далее к комментарию ниже:

Имейте в виду, что индексы B-дерева наиболее эффективны для данных с большим количеством элементов (т. Е. Столбцов с множеством возможных значений, где данные в столбце уникальны или почти уникальны). Если у вас будет много значений NULL (или любое другое повторяющееся значение), оптимизатор запросов может решить не использовать индекс для фильтрации записей для вашего набора результатов, поскольку это будет быстрее, чем не делать этого. Однако эта проблема не зависит от того, является ли столбец внешним ключом или нет.

2 голосов
/ 22 октября 2010

Вы можете иметь NULL внешние ключи. Нет проблем. Я бы не ставил лишнюю таблицу только для папок без родителя (корневых папок). Это сделает ваш дизайн более сложным без каких-либо преимуществ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...