我想制作一个产品管理软件。我有很多products
,每个产品属于一个category
(n-1),每个category
可以有parent category
或不是(当它是最高类别时)。我想建立一个动态的"数据库模式,允许我稍后扩展。例如:奥迪未来将有2个子类别Audi Sport
和Audi Luxury
。如果某个类别具有子类别,则它不能包含产品本身,而只能包含子类别。只有叶子类别可以包含
车辆
我目前的架构是:
Category(ID, Name, ParentCategoryID)
Product(ID, CategoryID)
但似乎不满足我的要求
答案 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类别那里去的产品。
虽然处理拆分叶类别似乎是一种麻烦的方法,但它可以使用单个存储过程(最好是内部事务)来处理,而这种数据库结构确保只有叶类别可以有产品。