2015-06-16 4 views
0

Я хочу создать программное обеспечение для управления продуктами. У меня много products, каждый товар принадлежит одному category (n-1), каждый category может иметь parent category или нет (когда его верхняя категория). Я хочу построить «динамическую» схему базы данных, которая позволит мне расширить ее позже. Пример: Audi будет иметь 2 подкатегории: Audi Sport и Audi Luxury в будущем. Если категория имеет подкатегорию, она не может содержать сам продукт, а только дочерние категории. Только категория листа может содержать enter image description hereКатегория родителей - Подкатегория и организация базы данных продуктов

Vehicle

Моей текущую схему:

Category(ID, Name, ParentCategoryID) 

Product(ID, CategoryID) 

Но это, кажется, не удовлетворяет мою просьбе

+0

Ожидаете ли вы иметь цепочку подкатегорий (например, Audi, Audi sport, Audi aport convertible) или только один уровень подкатегорий? Кроме того, о каких rdbms мы говорим? –

+0

Я хочу иметь цепочку подкатегорий, каждая категория может иметь много подкатегорий, это не двоичное дерево. Audi Sport может быть разделен на Classic и Modern в будущем, Classic также может быть разделен на некоторые подкатегории. Это делает меня головоломкой. Мой RBDMS - это Microsoft SQL Server 2012 – Andiana

ответ

1

Поскольку только лист категория может содержать продукты, I будет предлагаться следующая структура:

TblCategory 
(
    Category_Id int PRIMARY KEY, 
    Category_Name nvarchar(30) -- or whatever length suits your needs 
    Category_Parent_Id int NULL FOREIGN KEY REFERENCE TblCategory(Category_Id), 
    CONSTRAINT UC_Category UNIQUE (Category_Name) 
) 

TblLeafCategory 
(
    LeafCategory_Id PRIMARY KEY int, 
    LeafCategory__Name nvarchar(30) -- or whatever length suits your needs 
    LeafCategory_Parent_Id int NOT NULL FOREIGN KEY REFERENCE TblCategory(Category_Id), 
    CONSTRAINT UC_Category UNIQUE (LeafCategory_Name) 
) 

TblProduct 
(
    Product_Id int PRIMARY KEY, 
    Product_LeafCategory_Id int NOT NULL FOREIGN KEY REFERENCE TblLeafCategory(LeafCategory_Id), 
    -- Other product columns 
) 

При добавлении подкатегории в любую категорию листьев вам нужно будет сначала скопировать ее имя и parent_Id в TblCategory, переименовать существующую категорию листьев в ее новое имя (то есть, если базой была Audi, а листок был Sport, вы должны добавить категорию Спорт в TblCategory и переименуйте лист в Classic), а затем добавьте новую категорию листьев и обновите таблицу продуктов, которая должна принадлежать ей (в примере с машинами добавьте Modern как категорию листьев, где она является родителем Sport, и обновите продукты, которые должны отправиться туда из классической категории).

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

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