父类别 - 子类别和产品数据库组织

时间:2015-06-16 10:38:21

标签: database-design database-schema categories

我想制作一个产品管理软件。我有很多products,每个产品属于一个category(n-1),每个category可以有parent category或不是(当它是最高类别时)。我想建立一个动态的"数据库模式,允许我稍后扩展。例如:奥迪未来将有2个子类别Audi SportAudi Luxury。如果某个类别具有子类别,则它不能包含产品本身,而只能包含子类别。只有叶子类别可以包含 enter image description here

车辆

我目前的架构是:

Category(ID, Name, ParentCategoryID)

Product(ID, CategoryID)

但似乎不满足我的要求

1 个答案:

答案 0 :(得分:1)

由于只有叶子类别可能包含产品,我建议使用以下结构:

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,将现有的叶子类别重命名为它的新名称(即如果基础是奥迪并且叶子是Sport,您应该将Sport类别添加到TblCategory,并将叶子重命名为Classic)然后添加新叶子类别并更新应该属于它的products表格(在汽车示例中,将Modern添加为叶子它的父母是Sport的类别,并更新应该从Classic类别那里去的产品。

虽然处理拆分叶类别似乎是一种麻烦的方法,但它可以使用单个存储过程(最好是内部事务)来处理,而这种数据库结构确保只有叶类别可以有产品。