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

时间:2010-10-21 07:07:05

标签: c# sql database string

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

类别slu is可能类似于“shopping-clothing-women”。这将与3个深度类别相关联:购物>服装>妇女。

数据库中的对象将具有包含slug的类别字段。假设有几个对象,购物中有不同的slu>服装类别,可能是:“shopping-clothing-mens”,“shopping-clothing-kids”和“shopping-clothing-other”。

我有一个集合或字典,可以将该slug翻译成对最终用户更有意义的东西(例如,“shopping-clothing-womens” - >“Women's Clothing”)。

如果我想选择购物中的所有对象>服装类别,我会做这样的事情:

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

并且会取回购物的所有女士,男士,儿童和服装子类别>服装类别。

目标是简单的查询,但仍然保持强大的功能,几乎无穷无尽的子分类,没有疯狂的数据库关系和JOINS。我也倾向于在将来修改我的应用程序到NoSQL数据库,这将有助于实现它。

但是,上面的查询让我担心......会不会很慢?

这个计划是个坏主意吗?

2 个答案:

答案 0 :(得分:1)

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

关于Contains,我可能会选择StartsWith。这将产生LIKE 'shopping-clothing%'并且使用正确的索引会更快。

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

答案 1 :(得分:0)

另一种方法是拥有一个单独的类别表,其中包含可以嵌套的类别(没有shit Sherlock?)。像这样:

| ID | Name | ParentId |

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

然后在您的产品表中,您的类别列将引用类别表中的类别。然后,您可以轻松地从类别表中选择slug。

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

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