【问题标题】:Database Design - Multiple Category and Multiple Sub Category数据库设计 - 多类别和多子类别
【发布时间】:2023-03-11 09:17:01
【问题描述】:

我有一个关于如何设计多个类别和多个子类别的问题。一个商店将有多个类别和多个子类别。

例如,商店将女装、男装作为类别,并将配饰和下装作为子类别

如果重要的话,我使用的是 SQL Server 2016。这些是我目前拥有的表:

TABLE Store
    StoreID INT
    Description NVARCHAR(500)

TABLE Category
    CategoryID INT
    Description NVARCHAR(500)

TABLE Subcategory
    SubcategoryID INT
    CategoryID INT
    Description NVARCHAR(500)

【问题讨论】:

  • 如果子类别有子类别怎么办?您可以/应该将类别和子类别视为同一事物。
  • @Jerrad - 不,只是类别和子类别。子类别不会有子类别。
  • 每个商店可以有不同的类别和子类别吗?商店 1 可能有 cat(A) 和 (A1,A2) 的子,而商店 2 可能有 cat(A) 和子 (A1, A3) [注意同一猫的不同子] 和猫 (B) 和 (B1, B2) ?)如果是这样,我看到了商店; storeCategory 具有列 [StoreID、CatID、SubCatID] 和 FK 到 cat 和 SubCat 表。或者只有一个有两列的表猫和 fk 到同一张表两次。和表中的父ID;允许 N 维,但现在您必须使用递归查询或 forxml 路径。
  • 这里有一个提示:一个子类别就是一个类别

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


【解决方案1】:

只需创建另一个表 StoreCategories,它将保留 StoreID 和 CategoryID,以允许每个 Store 有多个 Categories,每个 Category 有多个 Store。

确保为每个表正确放置外键。 如果一个子类别可以用于多个类别,则可以放置另一个中间表。
显然是为了避免双重子类别。

【讨论】:

  • 这种设计是否也允许分类有多个子分类?
  • 确实如此,每个子类别都有一个类别。因此,链接到类别的所有子类别的总和构成了多重性。
  • 好吧,也许我用多个错误地指代了它,但每个类别也将有多个子类别。男装类别将有子类别(鞋子、配饰、领带),而女装类别也将有子类别(鞋子、配饰)
  • 这个实现允许每个分类有多个子分类
  • 不是这样,可以在“Category”和“SubCategory”之间放置一个表格来增强多样性。我们在一个 1->n 的多重性上,通过一个中间表我们可以有一个 n->n 的多重性,如果它在多个类别中,这可以用来避免同一个子类别相乘。
【解决方案2】:

我认为拥有单独的 Category 和 SubCategory 表没有任何价值。只需一个 Category 表,其中包含一个可为空的 ParentCategory 列。

TABLE Category      
  CategoryID INT
  ParentCategory INT
  Description NVARCHAR(500)

您的顶级类别将是带有 null 的 ParentCategory 类别。

您说现在不会有多个级别的子类别,但是像这样的要求有可能在未来发生变化。如果您最终在某个时候确实需要子子类别,那么您不必使用这样的设计重写一堆查询。

然后你需要一个表来存储商店的类别:

TABLE StoreCategory
  StoreID INT
  CategoryID INT

【讨论】:

  • 有一个,如果您不希望 SubCategories 直接与 Store 链接,但只能通过 Category。
  • 这可以使用触发器来强制执行。
  • 是的,但触发器会消耗性能,但我承认你的电话很好,它将减少你对设计的技术债务。
  • 我不认为会有这么多类别(或者它们会如此频繁地更新)触发性能会成为问题。
  • 这主要看这里涉及的业务。
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 2011-07-20
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多