Вопрос проектирования базы данных - Категории / Подкатегории - PullRequest
10 голосов
/ 22 марта 2011

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

TABLE Category
    CategoryID INT
    Description NVARCHAR(500)

TABLE Subcategory
    SubcategoryID INT
    CategoryID INT
    Description NVARCHAR(500)

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

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

TABLE Product
    SubcategoryID INT  -- should this be subcategory?

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

Ответы [ 6 ]

10 голосов
/ 22 марта 2011

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

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

Если возможность связать несколько подкатегорий с продуктом является требованием, к точке зрения @ Микаэля, вам понадобится такая настройка, которая создаетотношение «многие ко многим» через таблицу соединения / пересечения, 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))

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

Эрик Тарасофф

3 голосов
/ 22 марта 2011

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

create table product (id, name,...)
create table tag (id, name, description)
create table product_tag (product_id, tag_id)
3 голосов
/ 22 марта 2011

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

Если вы сохраняете это как есть, вы ограничены сценарием «Категория»> «Подкатегория», поскольку у вас не может быть подкатегорий «Подкатегории».

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

2 голосов
/ 22 марта 2011

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

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

Например, если у вас есть Электроника> ТВ, можете ли вы также использовать Развлечения> ТВ?и т.д.

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

hth

1 голос
/ 22 марта 2011

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

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

0 голосов
/ 22 марта 2011

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

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

...