【问题标题】:Database Design Question - Categories / Subcategories数据库设计问题 - 类别/子类别
【发布时间】:2011-07-20 01:02:21
【问题描述】:

我有一个关于如何在我的数据库中设计几个表的问题。我有一个表来跟踪类别和一个子类别:

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。

【问题讨论】:

  • 您的方法工作正常,并且对于一个特定场景(具有子类别的类别)很简单(简单查询),但如果您有其他要求,例如更深层次的子类别子类别,与添加 parent_id 的单个表一起使用

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


【解决方案1】:

你的设计是合适的。我是一名数据库专家,后来成为开发人员,所以我可以理解将 Category 和 SubCategory 放在一个表中的倾向,但 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))

希望对您有所帮助...

埃里克·塔拉索夫

【讨论】:

  • 这是否允许我创建多个子类别?
  • 这表示一个产品可以有多个子类别(反之亦然)......但一个子类别只与一个类别相关联。
  • 即使子类别重复,它也不必具有相同的属性。 m-m 不是很实用。具有单独属性表的自联接表更有可能涵盖更多情况。
  • @EricTarasoff 如果我需要有多个类别和多个子类别,我需要更改什么?
【解决方案2】:

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

如果您保持原样,您将被限制在 Category > Subcategory 场景中,因为您不能拥有 SubCategories 的 SubCategories。

如果将它们放在一个表中,则需要为ParentID 提供一列。如果一个类别是最高的,它将有一个 0 的ParentID。如果你想允许每个子类别的子类别不受限制,例如Electronics > Recordable Media, Blueray, 4gb 你将需要使用递归编程来显示它们。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 产品标签对第三和第四级别的类别有帮助吗?
    【解决方案4】:

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

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

    例如如果你有电子 > 电视,你还能有娱乐 > 电视吗?等等

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

    【讨论】:

    • 我希望它们分开,但我不确定它们是否需要分开。至少我需要能够单独检索“顶级”类别。
    • 在此方案中,顶级类别定义为所有没有父类别的类别。对我来说似乎是干净的设计。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      这取决于您的要求。如果每个产品链接到不超过一个子类别,您应该在产品中具有 SubCategoryID。也无需添加 CategoryID。

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

      【讨论】:

      • 我认为“Category”级别就像一个超级级别,不应该直接链接产品,应该始终有一个子类别来链接产品。
      猜你喜欢
      • 2015-10-15
      • 2023-03-11
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      相关资源
      最近更新 更多