数据库设计问题 - 类别/子类别

时间:2011-03-21 21:49:54

标签: sql sql-server-2008 database-design

我对如何在数据库中设计几个表有疑问。我有一个表来跟踪类别,一个用于子类别:

TABLE Category
    CategoryID INT
    Description NVARCHAR(500)

TABLE Subcategory
    SubcategoryID INT
    CategoryID INT
    Description NVARCHAR(500)

类别可能类似于电子产品,其子类别可能是DVD播放器,电视等。

我有另一个表将引用Category / Subcategory。是否需要引用SubcategoryID?

TABLE Product
    SubcategoryID INT  -- should this be subcategory?

有更好的方法可以做到这一点还是这是正确的方法?我不是一个数据库设计人员。如果重要的话,我正在使用SQL Server 2008 R2。

6 个答案:

答案 0 :(得分:10)

您的设计是合适的。我是一个数据库人员变成了开发人员,所以我可以理解在一个表中有类别和子类别的倾向,但是KISS永远不会出错。

除非要求极端性能或无限等级(我猜不是),否则你很高兴。

如果能够将多个子类别与产品相关联是一项要求,那么对于@ Mikael来说,您需要这样的设置,通过连接/交叉表创建多对多关系,Product_SubCategory:< / p>

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))

希望有帮助...

Eric Tarasoff

答案 1 :(得分:3)

CategoriesSubCategories设置两个单独的表格取决于您的情况。

如果按照原样保留,则仅限于类别&gt;子类别场景,如您不能拥有SubCategories的SubCategories。

如果您将它们放入一个表格中,则需要ParentID列。如果某个类别是最重要的,则其ParentID为0.如果您想允许子类别的无限子类别,例如Electronics > Recordable Media, Blueray, 4gb您将需要使用递归编程来显示它们。

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

如果一个'sub'类别可以属于多个'parent'类别,则添加一个链接类,否则添加一个列以指向父类。

e.g。如果你有电子产品&gt;电视,你还可以娱乐&gt;电视?等

您的其他表应仅引用category_id(注意 - 不是parent_category_id)

HTH

答案 4 :(得分:1)

这取决于您的要求。如果每个产品都链接到不超过一个SubCategory,那么您应该在Products中拥有SubCategoryID。也不需要添加CategoryID。

需要不同模型的其他方案可能是产品可以直接链接到Category而不是SubCategory,或者一个Product可以链接到多个SubCategory,或者SubCategory链接到多个Category。 / p>

答案 5 :(得分:0)

只要Sub-Categories永远不会在不同的类别中重复,特别是如果它们具有不同的属性,那么您提出的方法就是好的。

当您添加/编辑产品时,可能会出现一个问题,即使您可能想要一个用户可以编辑类别的控件,您也没有类别字段。