Таблица базы данных комментариев Foreignkeys против просто ID

Я работаю над новым проектом, и мне нужно настроить таблицу базы данных «Комментарии».
В моем проекте можно будет комментировать «страницу», «пост», «тему форума» или что-то еще.
Теперь мне интересно, как лучше настроить мою таблицу «Комментарии» в среде Laravel, учитывая скорость и работоспособность?

Либо создайте таблицу с несколькими внешними ключами, где один ключ всегда будет заполнен, а другой будет пустым


id (int) — комментарий (текст) — пост (FK) — тема (FK) — страница (FK)


или создайте таблицу без внешних ключей, но только с идентификатором и строкой, которая указывает тип комментария, подобный этому


id (int) — комментарий (текст) — type (varchar — ‘post’ или ‘topic’) — type_id (int — идентификатор ‘post’ или ‘topic’)


-1

Решение

Будет лучше, если вы выберете второй подход.

Если позже был добавлен еще один источник для принятия комментариев, таблица будет нуждаться в модификации, если вы будете следовать первому подходу. Кроме того, возможно, что один и тот же пользователь может предоставить комментарии еще раз по той же теме. Этот способ хранения (2-й подход) помогает.

Выборка записей по-прежнему будет эффективной, поскольку, будь то одна строка (1-й подход) или несколько строк (2-й подход), записи для определенной темы будут по-прежнему очень избирательными (и поэтому эффективными) по сравнению с общим размером таблицы ,

1

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

Для коэффициента масштабируемости вы должны создать таблицу, в которой будет содержаться тип публикации, под которой будет находиться комментарий, чтобы вы могли добавлять другие типы публикаций в будущем.

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

id (int) — комментарий (текст) — parent_type (int) — parent_id

parent_id (int) — parent_name (varchar)

В зависимости от типа, вы решаете, с какой таблицей вы собираетесь сделать соединение.

2

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

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