11

简短的问题:应该如何管理出现在多个类别下的产品类别?这样做是一个坏习惯吗?

背景信息: 我们有一个产品数据库,其类别如下:

Products

  -Arts and Crafts Supplies
    -Glue
    -Paper Clips
    -Construction Paper


  -Office Supplies
    -Glue
    -Paper Clips

请注意,胶水和回形针被分配给这两个类别。虽然它们出现在这个类别树中的两个不同位置,但它们在数据库中具有相同的类别 ID。为什么?两个原因:

  1. 类别被分配了属性——例如,回形针可以有重量、材料、颜色等。
  2. 分配到胶水类别的产品显示在工艺品和办公用品下。这是意料之中的——它们与数据库中的实际类别 ID 相同。

这使我们能够管理单个类别及其属性和分配的产品,但将其放置在类别树中的多个位置。

我们使用的是嵌套集模型,所以我们用来支持它的 db 结构是:

Category
----------
CategoryID
CategoryName


CategoryTree
------------
CategoryTreeID
CategoryID
Lft
Rgt

因此,Category 和 CategoryTree 之间存在 1:M,因为在类别树中可以有给定类别的多个实例。

是否有一种更简单的方法来对此进行建模,以允许产品类别显示在多个类别下?

4

4 回答 4

5

只要所有胶水确实适用于办公用品工艺用品,我认为这没有任何问题。

于 2009-10-01T15:32:10.633 回答
3

你所拥有的是一个好方法,但为什么不像这样简化第二个表:

类别

身份证名称

子类别

ID 类别ID 子类别ID

尽管对于未来,我会提防在两个根类别之间共享子类别。有时最好创建一个独特的产品分类以保持一致性,这对您来说更容易管理,并且可能更容易为客户导航。否则,您会遇到问题,如果您在来自办公用品的 Glue 页面上,那么您是否也显示其他路径?如果没有,您将拥有两个相同的页面,但路径除外,这对 SEO 来说是个问题。如果这样做,那么用户可能会感到困惑。

于 2009-10-01T15:36:06.697 回答
2

最著名的例子是谷歌邮件,它的分类就是这样完成的。谷歌以其产品的可用性而闻名......

我相信其他词比“父”词更可取,实际上只暗示 XToOne 关系......

也许你可以说一个Productas many Categories,所以关系将是 ManyToMany。并且只有显示会以类别开头以到达产品...


这会突出一个问题:如果您不限制类别的数量,并且显示带有子类别的类别等等,您最终可能会得到:

  • 庞大的类别和产品列表,有很多重复
  • 很大的深度(可能不可读)

有趣的部分是突出问题,然后想象一个适合最终用户的解决方案。

于 2009-10-01T15:28:46.163 回答
1

一个类别可能有必要拥有多个父级。但是,无论您在哪个父类别下找到类别,其子类别都应保持不变。

我见过真实的系统可以精确地实现这个逻辑并且运行良好。

编辑

为了回答您的问题,我认为我建议的模型并不像您想象的那样具有限制性。基本上,树的给定分支可能会在多个父分支下找到,但无论在哪里找到,它都有相同的子分支。没有什么能阻止你挑选一个分支的一些孩子,也让他们成为另一个分支的孩子。

因此,例如,您可以在办公用品和爱好用品下都包含胶水类别,如果您在胶水下添加“Crazy Glue(栓剂版)”,它会同时出现在两者中。如果您有可能在逻辑上组合在一起但需要按用途分开的项目,您仍然可以这样做。您可以将粘胶和糊状物放在爱好粘合剂的类别下,该类别在爱好根下,但不在办公室根下。或者您可以这样做,同时拥有一个供您的买家在内部使用的组合类别。您不能做的是,一旦您将这种新型粘合剂添加到您的业务模型本体中的任何位置,就忘记在所有相关类别中包含它。

简而言之,您在此限制下损失很少,但会获得一些结构,以帮助避免必须单独管理每个项目的问题。

编辑

假设我已经为模型本身提出了令人信服的案例,那么仍然存在实施问题。有很多选择,但这里有一种方法:

有一个 CatalogItem 表,其中包含一个合成主键、标签、可选的描述/详细信息文本和一个可选的 SKU(或等效项)。然后,您将拥有一个具有子 ID 和父 ID 的多对多 CatalogItemJoin,双方都限制为 CatalogItemTable。

显示为父项的项目是一个类别,因此它不应该有 SKU。仅作为子项出现的项目是产品,因此它应该有一个 SKU。任何项目有多个父项都可以;这只是意味着它属于多个类别。同样,每个父母有多个孩子也没有问题;这将是其中包含一些产品的类别的典型案例。但是,给定一个类别的 ID,无论哪个父类别将您带到那里,它的子类别都是相同的。另一个限制是你要避免循环。

于 2009-10-01T15:27:22.467 回答