Разработка таблицы SQL с иерархией / подкатегориями

У меня есть таблица, которая выглядит примерно так:

ID | Ключевое слово Категория | Подкатегория | Подкатегория | Sub-Sub-Sub Категория

Нужно ли разделить его на две таблицы (таблица ключевых слов и таблица категорий с родительским идентификатором), если одно ключевое слово может принадлежать только одной категории, подкатегории... и т. Д. Это означает, что нет повторений. есть ли еще необходимость разделить его?

5 ответов

Решение

Вам нужна только одна таблица для отображения 1-1. Для отображения отображений 1-многие или многие-многие следует использовать несколько таблиц.

Если ключевое слово может соответствовать только одной категории / подкатегории / подкатегории, ваш текущий макет должен быть в порядке.

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

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

Я бы сделал это в двух таблицах с каждым внешним ключом из таблицы Categories:

Keywords 
id (PK)
keyword
category_id (FK)

Categories
category_id (PK)
category
parent_category_id (FK)

Данные в таблице категорий будут выглядеть так:

category_id    category    parent_category_id
1              Food        null
2              meat        1
3              organic     1
4              fruit       3

и эти данные в таблице Ключевые слова будут выглядеть так:

id     keyword    category_id
1      grapes     4
2      chicken    2

Почему бы просто не добавить столбец ParentID и FK на ПК?

Возможно, имеет смысл разделить его, если вы собираетесь переименовать или перегруппировать ваши категории позже:

  • если вы оставите все как есть, вам придется выполнить этот шаг переименования / реорганизации (изменение полей категории / подкатегории / под-подкатегории / под-под-подкатегории) для каждой строки в этой таблице, содержащей эта (((под) под) под) категория. это приводит к более сложному запросу, и если в этой таблице ключевых слов очень много строк, это может быть проблемой производительности (= база данных займет некоторое время); с другой стороны, запросы (чтение) будут максимально быстрыми.
  • если вы разделите его, то обновление (((под) под) под) категории будет выполняться только для меньшего количества строк, но запрос (чтение) займет больше времени, поскольку он должен работать с двумя (или более) таблицами.

Взвесьте все за и против, а затем примите решение.

Я бы использовал две таблицы, как это.

   Categories
-------------------
PK,FK1 | CategoryID
       | Keyword 
       | Category 

  SubCategories
--------------------
PK,FK1 | CategoryID
PK,FK1 | SubCategoryID
Другие вопросы по тегам