Я пытаюсь создать систему комментариев.
Конструкция базы данных для вещей, я хотел бы прокомментировать (сообщения и статьи):Система комментариев для двух разных объектов
TABLE `posts` (
`post_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`post_text` text NOT NULL,
`user_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
TABLE `articles` (
`article_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`article_text` text NOT NULL,
`user_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Проблема
Каждый комментарий должен быть связанных с записью или статьей.
Мои попытки
Вариант № 1
я поставил возможность в article_id, а также post_id в ту же таблицу, и они оба могут быть оставлены пустыми.
TABLE `comments` (
`comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`comment_text` text NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`post_id` int(11) NULL,
`article_id` int(11) NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Как это там было бы article_id, когда статья комментируется и post_id, если пост комментируется.
Но стоит ли оставлять оба поля NULL, если всегда нужно быть NULL?
Вариант № 2
Создание двух отдельных таблиц. Один для комментариев для комментариев и один для комментариев к статье.
TABLE `article_comments` (
`comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`comment_text` text NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`article_id` int(11) NOT NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
TABLE `post_comments` (
`comment_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`comment_text` text NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`post_id` int(11) NOT NULL,
PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Как это никто, кто должен быть NOT NULL является NULL.
Однако я не знаю, может ли это стать проблемой производительности, и я уверен, что это приведет к большому количеству повторений в моем PHP-материале.
Есть ли лучший способ сделать это?
У меня нет опыта в таких вещах и был бы очень благодарен за помощь!
Wow !! Большое вам спасибо за ваш продуманный ответ! Я рассмотрю ваш совет! – Schwesi
@JohnRix подытожил проблему красиво. Это предложение будет рассмотрено: _ Однако, альтернативой, которую вы должны рассмотреть, является объединение ваших сообщений и статей в одной таблице «Содержимое» с свойством content_type или аналогичным – user2867342