#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. Супервизор — это еще одна запись сотрудника.