Хранить подкатегории форума в той же таблице или в отдельной таблице

#sql #rdbms

#sql #rdbms

Вопрос:

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

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

В качестве альтернативы вы можете создать отдельную таблицу ForumSubCategories и сделать идентификатор в этой таблице FK, ссылающимся на столбец PK Id таблицы ForumCategories.

Оба решения будут работать, но каковы плюсы и минусы каждого решения?

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

Комментарии:

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

2. Я думал о 2, когда спрашивал, но обсуждение сценария из более чем двух более чем приветствуется…

Ответ №1:

Я не могу придумать никаких преимуществ использования 2 таблиц. Использование 2 таблиц ограничит вас 2-уровневым деревом. Если вы смотрите на вещи как на объекты, то подкатегории на самом деле являются просто объектом категории. Поэтому поместите их в одну таблицу. Структуру таблицы 1 будет проще спроектировать и разработать запросы.

Ответ №2:

Если вы точно знаете, что ваши форумы будут иметь только 2 уровня категорий, то разумно иметь 2 таблицы.

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

Ответ №3:

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

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

Это типично для таблицы employee. Супервизор — это еще одна запись сотрудника.