由主分类 ID 取出(多个)下级子分类所对应的项,有没有什么好的办法?(其实似乎和 PHP 没什么直接关系?)

2014-08-22 22:50:08 +08:00
 raincious
有一个表结构比如:

```
项目:
项目ID
项目名
分类ID
...
```

```
还有一个多级分类结构:
分类1
+ 分类1.1
++ 分类1.1.1
+++ 分类1.1.1.1
+++ 分类1.1.1.2
+ 分类1.2

分类2
...
```

假定我现在有分类1的序号,现在想通过这个序号取出对应分类1及其子项中的所有项目的列表,请问有没有什么方便快捷的解决方案?最好能O(1)解决的。

目前想到的方法:

1、项目里新增一个字段(暂时称为“分类路径”),存储一个线性数据,用来储存分类的路径,数据比如:分类1[分隔符]分类1.1[分隔符]分类1.1.1。做查询的时候用LIKE从左开始匹配。

比如进到“分类1”的时候,搜索`分类路径` = "分类1[分隔符]*"。

进到“分类1.1”的时候,搜索`分类路径` = "分类1[分隔符]分类1.1[分隔符]*"。

但是LIKE这样算不算滥用什么的?+ 如果迁移到一个没有LIKE的数据库不就歇菜了么。


2、新建一个数据表,类似于:
```
项目分类路径们:

项目ID
隶属于分类
```

然后当写入项目的时候,爬出所选目标分类的路径树,比如

当一个项目被分配到“分类1.1.1.2”这个分类下,则依次写入记录:

```
项目ID:001
隶属于分类:分类1.1.1.2

项目ID:001
隶属于分类:分类1.1.1

项目ID:001
隶属于分类:分类1.1

项目ID:001
隶属于分类:分类1
```

相当于空间换时间了。但是这样的话:
1、如果未来这个项目要变更分类记录,就变得麻烦了,得删掉之前所有的记录,然后重新爬表(虽然可以优化掉一部分查询);
2、得维护一张分类的全表树形(或至少部分树)结构的缓存来让路径计算变得更快一些、并借此降低用来获得路径的数据库查询次数,这很显然增加了系统复杂度(因为需要处理比如缓存更新等等这样的情况)。



好吧各位。所以我想的两个方案都有缺点,你有啥办法呢?请分享下见解。谢谢。
3133 次点击
所在节点    PHP
4 条回复
vibbow
2014-08-23 01:48:25 +08:00
目前用的一个ERP系统,可以实现类“无限级”分类
前提是假设每个分类下面不会有超过9999个子分类

和你说的方法1基本一致

ID是固定的四位数字,使用方法如下:

0001 分类1
00010001 分类1子分类1
00010002 分类1子分类2
000100020001 分类1子分类2子子分类1
0002 分类2
00020001 分类2子分类1

这样...

你既可以把分类ID当TEXT用,然后用LIKE来匹配
也可以把分类ID当INT用,然后用范围来匹配...
faceair
2014-08-23 01:59:31 +08:00
瞬间觉得mongo好用了
Wuvist
2014-08-23 11:48:59 +08:00
xxiu
2014-08-23 12:00:04 +08:00
假如你的目录编辑不是很频繁的话。
http://www.cnblogs.com/phaibin/archive/2009/06/09/1499687.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/129384

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX