V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
raincious
V2EX  ›  PHP

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

  •  
  •   raincious · 2014-08-22 22:50:08 +08:00 · 3226 次点击
    这是一个创建于 3751 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个表结构比如:

    ```
    项目:
    项目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、得维护一张分类的全表树形(或至少部分树)结构的缓存来让路径计算变得更快一些、并借此降低用来获得路径的数据库查询次数,这很显然增加了系统复杂度(因为需要处理比如缓存更新等等这样的情况)。



    好吧各位。所以我想的两个方案都有缺点,你有啥办法呢?请分享下见解。谢谢。
    4 条回复    2014-08-23 12:00:04 +08:00
    vibbow
        1
    vibbow  
       2014-08-23 01:48:25 +08:00   ❤️ 1
    目前用的一个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
        2
    faceair  
       2014-08-23 01:59:31 +08:00   ❤️ 1
    瞬间觉得mongo好用了
    Wuvist
        3
    Wuvist  
       2014-08-23 11:48:59 +08:00   ❤️ 1
    xxiu
        4
    xxiu  
       2014-08-23 12:00:04 +08:00   ❤️ 1
    假如你的目录编辑不是很频繁的话。
    http://www.cnblogs.com/phaibin/archive/2009/06/09/1499687.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2850 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:05 · PVG 20:05 · LAX 04:05 · JFK 07:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.