2010-10-21 89 views
1

由于缺乏更好的术语,使用“链式字符串”构建嵌套类别“系统”的想法。计划如下:是否将类别嵌套为“串连”是一个坏主意?

类别slu could可能像“购物 - 服装 - 女性”。这与深度分类有关:购物>服装>女装。

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

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

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

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

,并会找回所有的女装,男装,儿童服装小类的购物>服装类别。

目标是简单的查询,但保持强大的能力接近无尽的子分类没有疯狂的数据库关系和JOINS。我也倾向于将来将我的应用程序适配到NoSQL数据库,这将有助于实现这一点。

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

这个计划是一个坏主意吗?

+0

你保持有效蛞蝓值的表?如果你在商店里穿衣服女人而不是购物服装的女人,会发生什么?会错过这个记录吗? – 2010-10-21 10:55:04

+0

是的,有一个内存收集与有效的类别slu。。谢谢你指出,虽然。 – Chaddeus 2010-10-21 12:09:10

回答

1

这听起来像个好主意。我看到的唯一直接的问题是很难重命名类别。解决这个问题的一种方法是链接类别的内部ID而不是代码。关于Contains,我可能会去StartsWith。这将产生一个LIKE 'shopping-clothing%',并且使用正确的索引速度会快很多。

还有一个提示:如果你用短划线添加每个类别,如果一个类别与另一个类别具有相同的前缀,就不会出现问题,如"shopping-clothing-womans-"。那么你总是可以使用StartsWith("shopping-clothing-")

+0

不打算重命名类别(但是,从来不知道呃?),好点。你说得对,StartWith会更好。谢谢。所以你认为只要我在类别上索引,这会运行得很快? – Chaddeus 2010-10-21 07:14:50

+0

是的,没问题。请考虑使用像我描述的短划线来附加所有类别。这将使系统更稳定。 – 2010-10-21 07:20:32

+0

我同意,好主意。可能的类别将通过硬编码列表进行控制,因此应该非常稳定。 – Chaddeus 2010-10-21 07:22:18

0

另一种方法是建立一个单独的类别表,其中包含可以嵌套的类别(不包括狗屎Sherlock?)。像这样:

| ID | Name | ParentId | 

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

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

如果你需要搜索购物,衣服内的所有产品,您的查询可能看起来像:

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

谢谢。我正致力于不依赖于关系数据库的概念,朝着NoSQL/Document数据库范式迈进。 – Chaddeus 2010-10-21 07:22:58

相关问题