如果开发一个云笔记应该怎么设计?

2022-07-21 21:17:28 +08:00
 cond0r

如果做一个支持协同编辑,文档共享,类似 yuque 那样的 应该怎么技术选型?

自己做了一款 web 的笔记软件,目录树结构,markdown 格式存储,支持协同编辑和公开分享(单页),遇到一些问题,

想请教一下各位

目前用 go 写的,协同用的 websockets 进行广播,存储用的 mysql,搜索索引用的 bleve

数据库的设计比较简单

notes 表除了常规的内容存储,加了一个ParentId来存储上级节点的 ID 来实现的无限下级

第一个问题是是权限问题

但是无法解决权限问题,比如我创建了一篇笔记本下面有 N 篇子笔记

我把笔记本分享给了 A,A 在下面又创建了 N 个子笔记,这玩意权限应该怎么管控

现在比较蠢,笔记 ID 用的 UUID,保证唯一性不能被遍历导致越权修改,

在通过笔记绑定 UID,设置只能由拥有者进行删除 /移动操作.

实际上如果知道其他人的笔记的 UUID 就能进行读取了..

目前协作编辑,实际上就是把分享的 UUID 共享给目标用户,这样他就能通过这个 UUID 来遍及下级节点进行编辑了.

想过用中间表来管理每一篇笔记的权限,但是感觉如果并发高是不是性能会差一点,虽然可以用缓存等方式解决

权限问题 2

就是公开分享,目前只能分享单页,也是因为上面的问题不好做权限管理,如果分享了 A 笔记本,下面有 1 万篇子笔记

如果用中间表势必要创建 1 万个权限表的数据..

第二个问题是双向链

如果想实现类似 obsidian 之类的双向链接功能

是不是要把文章拆分成 block

然后用一个中间表来管理 block 的类型和链接

第三个问题是数据库

现在用的绑定到编辑器的 onchange 事件,如果发生变化就更新,但是如果并发比较高的话感觉性能是个很大的问题,加上会有一些 api 会做一些比较多的实时写入,感觉 mysql 不是很好的选择

是不是用 mongo 会更好,但是现在用 gorm 做的绑定用起来确实方便,改成 mongo 感觉大部分数据库部分都得手撸语句.

1086 次点击
所在节点    问与答
5 条回复
FrankAdler
2022-07-21 21:27:52 +08:00
不建议 mongo ,典型的关系型数据,性能问题解决方案应该挺多的。
权限我感觉你可以想的简单点,每篇内容都是独立的,那权限也就是独立的,所谓的子内容不过是一个标记,到了展示层面排序锊好就行了,很单纯的树状数据,很多好的解决方案。
双向链笔记没用过不清楚场景不做评价。
cond0r
2022-07-21 21:30:55 +08:00
@FrankAdler #1 我明白每篇笔记都是独立的,但是如果单用户使用没啥问题,就是如果我父笔记下有 1w 篇子笔记,
那么我在把父笔记增加协作用户的时候 ,同时就要给下面的 1w 篇子笔记创建权限分配,但是如果笔记量更大,用户更多的时候感觉这个权限表就炸了..
FrankAdler
2022-07-22 16:15:42 +08:00
@cond0r 你子笔记需要继承权限吗,笔记不同于其他的场景,没必要继承吧,如果真要继承那你自己衡量向上查和单独记的成本
cond0r
2022-07-22 16:26:32 +08:00
@FrankAdler #3 目前就是不继承,但是不继承的话就会存在越权访问,如果继承的话 在协作场景里面就会存在在 N 个子笔记里面创建了新的,要回溯到上级 N 层找到共享的层级来绑定权限..
FrankAdler
2022-07-22 19:01:52 +08:00
@cond0r 越权是因为要展示层级关系导致的吗,这个可以通过去掉层级规避吗

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

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

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

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

© 2021 V2EX