2011-03-21 45 views
10

我有一个问题,我将如何设计我的数据库中的几张表。我有一个表来跟踪类别和一个小类:数据库设计问题 - 类别/子类别

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。

+0

你的方法工作正常,很简单(简单的查询),用于一个特定场景(类别有子类),但不是很可扩展的,如果你有其他需求ents喜欢更深层次的子类别的子级,去单个表添加parent_id – BlackTigerX 2011-03-21 22:36:50

回答

10

您的设计是适当的。我是一名数据库开发人员,所以我可以理解在一个表中有类别和子类别的倾向,但是您绝对不会错过KISS。

除非需要极端的表现或无限的层次结构(我猜不是),否则你很好。

如果能够将多个子类别与产品相关联是一个必要条件,对于@ Mikael而言,您需要一个像这样的设置,通过联接/相交表格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)) 

希望帮助...

埃里克Tarasoff

+0

明确帮助 – Freelancer 2013-05-21 10:31:49

+0

这是否允许我创建多个子类别? – TransformBinary 2013-12-03 13:22:24

+0

这表示一个产品可以有多个子类别(反之亦然)...但子类别仅与一个类别绑定。 – 2013-12-06 22:40:54

2

如果类别和子类别具有相同的属性,则将它们折叠为一个表格。

如果一个“子”类别可以属于多个“父”类别,则添加一个链接类别,否则添加一个单指向父指针的列。

例如如果您有电子产品>电视,您是否也有娱乐>电视?等

您的其他表应该引用只是CATEGORY_ID(注意 - 不parent_category_id)

心连心

+0

我希望他们是分开的,但我不知道他们需要。至少我需要能够分别检索“顶级”类别。 – Dismissile 2011-03-21 22:01:45

+0

在这个方案中,顶级类别被定义为没有父类别的所有类别。对我来说似乎是干净的设计。 – Martijn 2011-03-21 22:10:27

0

只要子类别从来没有在不同的类别重复,特别是如果他们有不同的属性,那么你提出的方法是好的。

当您添加/编辑产品时,您可能会遇到一个问题,并且您没有类别字段,即使您可能想要一个控件可供用户编辑类别。

3

CategoriesSubCategories两个单独的表取决于你的情况。

如果你保持它的方式,你仅限于一个Category> Subcategory场景,因为你不能有SubCategories的SubCategories。

如果您将它们制作成一张表格,则需要一列ParentID。如果一个类别是最顶级的,它将具有0的ParentID。如果你想允许无限子类别foreach子类别,例如, Electronics > Recordable Media, Blueray, 4gb您将需要使用递归编程来显示它们。

1

这取决于您的要求。如果每个产品链接到不超过一个子类别,则应在产品中使用子类别标识。没有必要添加CategoryID。

需要不同模型的其他场景可能是产品可能直接链接到类别而不是子类别,或者一个产品可能链接到多个子类别或者子类别链接到多个类别。

+0

我认为“类别”级别就像一个超级的级别,没有产品应该直接与它链接,应该总是有一个子类别来链接产品。 – NoChance 2017-01-28 10:27:09

3

将标签附加到产品中而不是类别层次结构中。它更加灵活。

create table product (id, name,...) 
create table tag (id, name, description) 
create table product_tag (product_id, tag_id) 
+0

将产品标签帮助**第三和第四级别的类别? – stom 2015-10-20 20:49:24