Разработка таблицы SQL с иерархией / подкатегориями - PullRequest
5 голосов
/ 23 января 2010

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

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

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

Ответы [ 5 ]

6 голосов
/ 23 января 2010

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

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
5 голосов
/ 23 января 2010

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

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

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

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

1 голос
/ 23 января 2010

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

1 голос
/ 23 января 2010

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

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

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

1 голос
/ 23 января 2010

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

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

  SubCategories
--------------------
PK,FK1 | CategoryID
PK,FK1 | SubCategoryID
...