考虑使用“链式字符串”构建嵌套类别“系统”,因为缺少更好的术语。这是计划:
类别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数据库,这将有助于实现它。
但是,上面的查询让我担心......会不会很慢?
这个计划是个坏主意吗?
答案 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')