Вопрос проектирования базы данных - Категории/Подкатегории
У меня вопрос, как я буду создавать несколько таблиц в моей базе данных. У меня есть таблица для отслеживания категорий и одна для подкатегорий:
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
Пока подкатегории никогда не повторяются в другой категории, и особенно если у них разные атрибуты, то ваш предложенный метод хорош.
Одна проблема может возникнуть при добавлении/редактировании продуктов, и у вас нет поля для категории, даже если вам, вероятно, нужен элемент управления, где пользователь может редактировать категорию.