Я строю проект управления проектами с 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;
Этот внешний ключ будет препятствовать созданию системы posts
с parent_topic_id
это не указывает ни на что topic_id
в topics
стол, либо по ошибке, либо по злому умыслу.
ON DELETE CASCADE
означает, что всякий раз, когда вы удаляете topic
, все соответствующие posts
будет удален вместе с ним.
ON UPDATE CASCADE
означает, что если вы обновите topic
ID, он обновит идентификаторы всех ссылок posts
,
Что касается создания ключа — как вы заметили, вы должны создать его там же, где вы создаете саму таблицу.
Замечания:
Различные механизмы хранения имеют различные ограничения на поддержку внешнего ключа. InnoDB, который вы используете, является довольно безопасной ставкой, но вы должны пересмотреть документация чтобы получить полную информацию.
Отношение внешнего ключа является частью метода нормализации.
Здесь, если вы не используете отдельную таблицу для сообщения, и дублирование тем будет происходить так, как будто одна тема будет иметь несколько сообщений.
здесь у вас есть отдельные таблицы для сообщений и тем, а также темы для связи с сообщениями по внешнему ключу.
Таким образом, вы можете управлять обеими таблицами. Удаление тем удалит все сообщения, связанные с темой.