Вопрос проектирования базы данных - Категории/Подкатегории

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

TABLE Category
    CategoryID INT
    Description NVARCHAR(500)

TABLE Subcategory
    SubcategoryID INT
    CategoryID INT
    Description NVARCHAR(500)

Категория может быть чем-то вроде Электроника, а ее подкатегориями могут быть DVD-плееры, телевизоры и т.д.

У меня есть другая таблица, которая будет ссылаться на категорию/подкатегорию. Нужно ли ссылаться на идентификатор подкатегории?

TABLE Product
    SubcategoryID INT  -- should this be subcategory?

Есть ли лучший способ сделать это или это правильный путь? Я не очень разбираюсь в дизайне базы данных. Я использую SQL Server 2008 R2, если это имеет значение.

Ответ 1

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

Если экстремальная производительность или бесконечная иерархия - это требование (я предполагаю, что нет), вам хорошо идти.

Если возможность связать несколько подкатегорий с продуктом является требованием к точке @Mikael, вам понадобится такая настройка, которая создает отношения "многие ко многим" через таблицу join/intersect, Product_SubCategory:

CREATE TABLE Product (ProductID int, Description nvarchar(100))
CREATE TABLE Product_SubCategory (ProductID int, SubCategoryID int)
CREATE TABLE SubCategory (SubCategoryID int, CategoryID int, Description nvarchar(100))
CREATE TABLE Category (CategoryID int, Description nvarchar(100))

Надеюсь, что это поможет...

Эрик Тарасов

Ответ 2

Наличие двух отдельных таблиц для Categories и SubCategories зависит от вашей ситуации.

Если вы сохраните его так, как это указано, вы ограничены сценарием Category > Subcategory, так как вы не можете иметь подкатегории подкатегорий.

Если вы сделаете их в одну таблицу, вам понадобится столбец для ParentID. Если категория самая верхняя, у нее будет ParentID of 0. Если вы хотите разрешить неограниченные подкатегории foreach подкатегории, например. Electronics > Recordable Media, Blueray, 4gb вам нужно будет использовать рекурсивное программирование для их отображения.

Ответ 3

Прикрепите теги к продуктам вместо иерархии категорий. Это намного более гибко.

create table product (id, name,...)
create table tag (id, name, description)
create table product_tag (product_id, tag_id)

Ответ 4

Если категории и подкатегории имеют одинаковые атрибуты, то сверните их в одну таблицу.

Если одна категория "под" может принадлежать более чем одной "родительской" категории, добавьте класс ссылок, в противном случае добавьте один столбец, чтобы указать родительский элемент.

например. если у вас есть Электроникa > ТВ, у вас также есть Entertainment > TV? и др.

Ваша другая таблица должна ссылаться только на category_id (note - not parent_category_id)

HTH

Ответ 5

Это зависит от ваших требований. Если каждый Продукт связан не более чем с одной подкатегорией, у вас должен быть SubCategoryID в Products. Также нет необходимости добавлять CategoryID.

Другие сценарии, требующие использования другой модели, могут заключаться в том, что Продукт может напрямую ссылаться на Категорию, а не на подкатегорию, или на то, что один Продукт может быть связан с несколькими подкатегориями или что подкатегория связана с несколькими категориями.

Ответ 6

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

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