代码之家  ›  专栏  ›  技术社区  ›  Chaddeus

类别嵌套作为“字符串链”是个坏主意吗?

  •  1
  • Chaddeus  · 技术社区  · 14 年前

    考虑使用“链字符串”构建嵌套的类别“系统”,因为缺少更好的术语。计划如下:

    类鼻涕虫可能类似于“购物女装”。这将与3个深层次的类别相关联:购物>服装>女式。

    数据库中的对象将有一个类别字段,其中包含slug。假设有几个对象,在购物服装类别中有不同的段塞,可能是:“购物服装男士”、“购物服装儿童”和“购物服装其他”。

    我会有一个集合,或者一本字典,可以把这个slug翻译成对最终用户更有意义的东西(例如,“Shopping Cloths Womens”->“Women's Clothing”)。

    如果我想选择“Shopping”>服装类别中的所有对象,我将执行以下操作:

    DB.Objects.Where(a => a.Category.Contains("shopping-clothing"));
    

    并返回购物>服装类别的所有女性、男性、儿童和服装子类别。

    其目标是简单的查询,但仍然强大,具有近乎无限的子分类能力,而无需疯狂的数据库关系和连接。我还倾向于将来将我的应用程序适应于NoSQL数据库,这将有助于实现这一点。

    但是,上面的问题让我担心…会慢吗?

    这个计划是个坏主意吗?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Pieter van Ginkel    14 年前

    这听起来是个好主意。我看到的唯一直接问题是很难重新命名类别。解决这一问题的一种方法是将类别的内部ID而不是代码链接起来。

    关于 Contains ,我可能会去 StartsWith . 这将产生一个 LIKE 'shopping-clothing%' 使用正确的索引速度更快。

    还有一个提示:如果您用破折号附加每个类别,那么如果一个类别的前缀与另一个类别的前缀相同,则不会出现问题。 "shopping-clothing-womans-" . 那么你可以一直使用 StartsWith("shopping-clothing-") .

        2
  •  0
  •   thomaux    14 年前

    另一种方法是有一个单独的类别表,其中包含类别(没有该死的sherlock?)可以嵌套的。这样地:

    | ID | Name | ParentId |
    

    在parentID为0的情况下,它是一个主类别。

    然后在“产品”表中,“类别”列将引用“类别”表中的类别。然后您可以很容易地从Categories表中选择slug。

    如果您需要搜索购物服中的所有产品,您的查询可能如下所示:

        SELECT * FROM PRODUCT WHERE CategoryId IN 
        (SELECT ID FROM CATEGORY WHERE ParentId = 'shopping_clothing_id')