Что мне сделает этот внешний ключ в моей таблице базы данных MySQL?

Я строю проект управления проектами с PHP и MySQL. Я решил добавить раздел форума типа Обсуждение. Я планирую сделать его похожим на ваши обычные форумы, но вместо другой темы / разделов форума, которая будет заменена идентификатором проекта, поэтому у каждого проекта в моем ПО для управления проектами будет свой собственный раздел форума.

Так что все, что мне действительно нужно, это сообщение в теме, а затем ответ в сообщении. Каждая тема будет иметь тему / заголовок, а затем текст / описание, и любые последующие сообщения / ответы будут «Сообщения»

Так я строю темы а также Сообщений Таблицы базы данных MySQL

Моя схема ниже. Сейчас я много лет работаю с этими БД, но у меня нет большого опыта работы с такими необычными функциями, как ИНОСТРАННЫЕ КЛЮЧИ

Итак, у меня есть этот внешний ключ SQL …

ALTER TABLE posts
ADD FOREIGN KEY(parent_topic_id)
REFERENCES topics(topic_id)
ON DELETE CASCADE
ON UPDATE CASCADE;

1) Как уже упоминалось, здесь не так много опыта, так что мой вопрос: что именно будет делать и предотвращать этот внешний ключ? Какая разница между тем, чтобы я имел это или не использовал вообще?

Будет ли ON DELETE CASCADE означает, что я могу удалить запись из topics таблица, и она автоматически удалит все записи с соответствующими topic_id на моем posts Таблица? Если так, то это действительно приятно и стоит добавить.

Я не уверен, что ON UPDATE CASCADE будет делать в этом случае, хотя?

2) Если моя таблица БД создается из моего кода PHP, как это …

$DiscussionPostsTableSql = "CREATE TABLE posts (
ALL my COLUMN DEFINITIONS HERE....)";
$db->query($DiscussionTopicReplyTableSql);

тогда я смогу создать этот внешний ключ таким же образом? Как это…

$foreignKeySql = "ALTER TABLE posts ADD FOREIGN KEY(parent_topic_id) REFERENCES topics(topic_id) ON DELETE CASCADE ON UPDATE CASCADE;)";
$db->query($foreignKeySql);

Или это нужно добавить другим способом?


Таблица тем

CREATE TABLE topics (
topic_id char(36) NOT NULL AUTO_INCREMENT,
project_id char(36) NOT NULL,
topic_subject VARCHAR(255) NOT NULL,
topic_content TEXT default NULL,
date_created DATETIME NOT NULL,
date_last_post DATETIME NOT NULL,
created_by_user_id char(36) NOT NULL,
last_post_user_id char(36) NOT NULL,
posts_count char(36) default NULL,
PRIMARY KEY (topic_id)
) TYPE=INNODB;

Таблица сообщений

CREATE TABLE posts (
post_id char(36) NOT NULL AUTO_INCREMENT,
parent_topic_id char(36) NOT NULL,
post_content TEXT NOT NULL,
date_created DATETIME NOT NULL,
created_by_user_id char(36) NOT NULL,
PRIMARY KEY (post_id)
) TYPE=INNODB;

Иностранный ключ

// Add Foreign Key between Topic and Posts tables
ALTER TABLE posts
ADD FOREIGN KEY(parent_topic_id)
REFERENCES topics(topic_id)
ON DELETE CASCADE
ON UPDATE CASCADE;

1

Решение

Этот внешний ключ будет препятствовать созданию системы posts с parent_topic_id это не указывает ни на что topic_id в topics стол, либо по ошибке, либо по злому умыслу.

ON DELETE CASCADE означает, что всякий раз, когда вы удаляете topic, все соответствующие posts будет удален вместе с ним.

ON UPDATE CASCADE означает, что если вы обновите topicID, он обновит идентификаторы всех ссылок posts,

Что касается создания ключа — как вы заметили, вы должны создать его там же, где вы создаете саму таблицу.

Замечания:
Различные механизмы хранения имеют различные ограничения на поддержку внешнего ключа. InnoDB, который вы используете, является довольно безопасной ставкой, но вы должны пересмотреть документация чтобы получить полную информацию.

1

Другие решения

Отношение внешнего ключа является частью метода нормализации.

Здесь, если вы не используете отдельную таблицу для сообщения, и дублирование тем будет происходить так, как будто одна тема будет иметь несколько сообщений.

здесь у вас есть отдельные таблицы для сообщений и тем, а также темы для связи с сообщениями по внешнему ключу.

Таким образом, вы можете управлять обеими таблицами. Удаление тем удалит все сообщения, связанные с темой.

1

По вопросам рекламы [email protected]