2010-01-22 3 views
5

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

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

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

ответ

5

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

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

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

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

1

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

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

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

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

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

Взвесьте плюсы и минусы обоих, а затем сделать decision.m

1

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

6

Я хотел бы сделать это в двух таблицах с каждым внешним ключом приходит из ТАБЛИЦЫ:

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 
+0

Это замечательно! Благодарю. основанный на другом ответе, я разделить его на производительность и следовать вашему дизайну. – chips

Смежные вопросы