V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nfroot
V2EX  ›  问与答

evernote 类型的树形目录,选择目录也展示子目录内容,数据库如何设计?

  •  
  •   nfroot · 2019-05-08 11:17:37 +08:00 · 1994 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想了好多遍,还是想搞个类似 evernote 这种记事软件

    1.树形菜单

    2.按目录搜索内容

    3.富文本和图片存储

    4.跨平台,这个太艰难

    甚至可以把网站也开发成这种形式,博客型网站主要还是记录为主,树形目录可以将个人的所有资料按类型一步步展开,整个知识体系都能清晰的分类出来,现在常规的博客只有一级目录,选择的时候太苍白了……当然缺点是可能目录的深度会很深

    目录 1
    -----目录 11
    -----------目录 111
    -----目录 12
    -----------目录 122
    目录 2
    -----目录 21
    -----目录 22
    

    现在主要考虑 2 个问题,第一个就是搜索和点击目录的时候,需要能展示子目录的内容,也想过一个内容可以存多个分类中(可能有必要)

    目前想到 2 个方式去实现

    存储“目录 121 ”中的内容,分类的存储方式:

    1.用字符型字段存储:目录 1 的 UUID+目录 11 的 UUID+目录 111 的 UUID
    点击目录的时候,where category like '目录 1 的 UUID%' order desc date
    这样就可以展示子目录的内容,而且可以支持一个内容处于多个分类中,对了还要做一下去重。
    优点:数据库结构简单,数据看着很清晰,缺点,用 like 速度应该偏慢
    

    2.用交换表的形式(应该是这个名词吧):

    用 UUID 类型字段存储分类和内容的 UUID,每一级分类都存储一行,比如要存储“目录 121 ”中的内容,会是这样
    增加第 1 行:目录 1 的 UUID+内容 UUID
    增加第 2 行:目录 11 的 UUID+内容 UUID
    增加第 3 行:目录 111 的 UUID+内容 UUID
    如果它属于 2 个分类就再按这个方式增加就可以了
    查询的时候,where category = '目录的 UUID'即可。
    优点:查询速度应该挺快,缺点:数据库看起来会占很多空间,目录多了不知道会不会在性能上蓝瘦香菇。
    

    按说这种需求应该很普遍,不知道大公司都是如何选择的,想学习下,其实如果只是个人使用,不管哪种应该都不会造成速度极慢,毕竟数据的量就在那摆着。

    另外撘楼问下,应该有比较优秀的开源实现吧?(不过自己开发的好处是自由,思想的自由太重要了!!!缺点就是耗时费力,如果有好的开源,也是很好的,但是比较考虑得多的还是数据存储和同步的问题,毕竟个人搭建的话,环境是多样变化的)

    8 条回复    2019-05-09 00:51:14 +08:00
    nfroot
        1
    nfroot  
    OP
       2019-05-08 11:28:55 +08:00
    以前用过一段时间的 evernote,其实还不错的,后来被“ QQ-我的收藏”拉拢,毕竟再好的东西也比不上方便快速啊……但是 QQ 收藏的缺点也是显而易见,分类太多了难以管理。想来想去,树形目录是唯一的出路,比如维护系统的工具和知识,来这么一组内容,真是不要太方便了!

    系统维护
    --安装
    -------分区
    -------------MBR、UEFI 知识点
    -------------分区、硬盘维护工具
    -------镜像
    -------安装
    -------------安装工具
    -------封装
    -------------封装工具
    -------------封装知识点
    --维护
    -------组策略
    -------控制面板
    -------注册表
    nfroot
        2
    nfroot  
    OP
       2019-05-08 14:25:18 +08:00
    咦,这个不会没人回复吧,大佬们,求带一下啊
    xiri
        3
    xiri  
       2019-05-08 14:31:20 +08:00 via Android
    各种 wiki,文档管理系统不都是这样的吗?
    nfroot
        4
    nfroot  
    OP
       2019-05-08 16:48:13 +08:00
    @xiri wiki 不是树形的吧。。感觉还是要树形的分类,打开很容易就找到自己记录的东西了。
    merkle2222
        5
    merkle2222  
       2019-05-08 16:53:38 +08:00
    nosql
    qping
        6
    qping  
       2019-05-08 16:54:48 +08:00
    目录再多也不会到百万的级别,不需要优化性能,你还是考虑代码怎么容易实现吧
    qinxg
        7
    qinxg  
       2019-05-08 16:59:43 +08:00
    aaa
    aaa.bbb
    aaa.bbb.ccc

    zzz
    zzz.yyy
    zzz.yyy.xxx
    agagega
        8
    agagega  
       2019-05-09 00:51:14 +08:00
    ## 树形菜单

    我认真地想过这个问题,因为我想过写一个大纲软件,像 Workflowy 那样的。其实做树形结构,用数据库,成熟点的方法无非就 parent_id 和直接存 JSON 两个方法,然后搭配上必要的缓存。不过目录这样的结构总体比较浅,应该也不会有啥性能问题。Postgres 好像还有做树形结构的插件。

    ## 按目录搜索内容

    最简单的办法就是字符串匹配(其实稍微设计下搜索语法,比如空格分隔的两个词怎么处理,效果也可以),好一点,数据库应该有分词+索引+全文搜索插件的。

    ## 富文本和图片存储

    富文本只有用某种形式的 XML 了,其实编辑器才是更难搞的问题,所以用 Markdown 多好。图片就用文件存呗,然后用张表索引一下。

    ## 跨平台,这个太艰难

    做成 Web 就好了……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5591 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:33 · PVG 14:33 · LAX 22:33 · JFK 01:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.