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

2019-05-08 11:17:37 +08:00
 nfroot

想了好多遍,还是想搞个类似 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'即可。
优点:查询速度应该挺快,缺点:数据库看起来会占很多空间,目录多了不知道会不会在性能上蓝瘦香菇。

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

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

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

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

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

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

## 按目录搜索内容

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

## 富文本和图片存储

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

## 跨平台,这个太艰难

做成 Web 就好了……

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

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

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

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

© 2021 V2EX