为什么我们不用 git 当数据库呢?

2022-11-22 16:47:19 +08:00
 andyJado

一行 sql 也没写过不知道为啥要用这玩意 blob tree grep awk 各种 pipe 倒是一点不怵 我感受不到任何 crud 比 git 更好用的(个人感受 github 就是拿 git 当数据库的, 对吧?(摆事实

11590 次点击
所在节点    程序员
101 条回复
wangxiaoaer
2022-11-22 19:26:30 +08:00
“github 就是拿 git 当数据库的, 对吧?(摆事实”

你不会以为 GitHub 的后台就是一个仓库一个文件夹就完事儿了吧。
h4dWDy259W6zw3Z4
2022-11-22 19:27:40 +08:00
excel 也算数据库吧
superrichman
2022-11-22 19:33:46 +08:00
@dacapoday 太酷了
nulIptr
2022-11-22 19:47:47 +08:00
我大一的时候就想到这个问题了,ini 也能存数据,要数据库干球
andyJado
2022-11-22 20:31:09 +08:00
@anlythree
把商品当作 commiter, 它 commit(入库抽象为 commit?)自带名称,时间,联系方式的鸭.

查看最近的十条提交不难吧?
andyJado
2022-11-22 20:34:25 +08:00
@wangxiaoaer

@ArianX

但是你在 github 里面查看 blame 鸭, diff 鸭, commit history 鸭, 这些都是服务器端的 git 操作吧?
这些还能是 github 重写的逻辑? 如果不是的话, 那我用 git 做后台这些功能我就是相当于免费获得的嘛.
andyJado
2022-11-22 20:35:12 +08:00
@ljrdxs 我一行 sql 都没写过, 我当然不知道, 不知道才来问啊.
wxf666
2022-11-22 21:13:08 +08:00
@andyJado 比如 V 站的 1K 个节点、60W 个用户、90W 个帖子、1200W 个回复,

以及每个用户的个人信息、所有提醒通知、虚拟货币消费历史,

还有每个帖子中某些用户的“感谢回复者”记录等,

怎么在 Git 里存储呢?


增删查改 节点、用户及个人信息、帖子、回复、提醒、消费 等,大概咋实现呢?
idblife
2022-11-22 21:22:08 +08:00
太年轻呗,没见过世面
deplivesb
2022-11-22 21:29:35 +08:00
我看了下 op 的历史帖子和发言,我只能说。。。。不怕无知,就怕不知道自己无知
GeruzoniAnsasu
2022-11-22 21:36:25 +08:00
不如…… 你写几行 sql 就知道为什么了。
找本数据库教材的入门书,开头的例子就应该感受得到


1. 数据库不等于索引表
2. git 本身也使用了很复杂的数据结构和索引表来管理(甚至是二进制的)数据,与数据库系统有相通点,但完全是两种目的
3. 使用数据库系统的主要目的和关键特性是「关系」这个概念,我们提到数据库系统通常情况下都指的是关系型数据库,它能为现实需求的各种离散数据建立起相互映射,以便能从一套数据查询到另一套数据
4. 在「关系查询」的基础上,现代数据库做了无数无法想象的努力,从数据组织(压缩、值类型、存储优化)到查询算法(索引类型、SQL 、查询计划与优化、地理算法等特殊关系查询)再到网络和并发(事务 /ACID/日志、锁、「连接」: https://zh.wikipedia.org/zh-cn/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5 ) 绝大多数的特性都无法在数据库系统以外的系统中找到


------


教材一般会用这种例子:
建立班级表、学生表、成绩表,查询每班平均成绩,所有班级某成绩以上人数、某学生屡次考试成绩并倒序排列…… 考虑考虑吧
andyJado
2022-11-22 21:38:31 +08:00
@wxf666

git 本身有用户系统, 复用. 每个节点一个 submodule, 互不干扰, 每个帖子一个 commit obj, 每个‘回复(包括原贴)’ 都是一个 blob obj. 因为不需要文件系统所以不需要 tree obj?

这样可以完全避开系统调用, 所有事情只发生在.git/objects/里
ksedz
2022-11-22 21:42:54 +08:00
有类似思想的数据库
https://irmin.org
A distributed database built on the same principles as Git

SQL 还是强在足够表达力的基础上标准化程度高吧
SunsetShimmer
2022-11-22 21:45:13 +08:00
如果不考虑效率和实现难度,什么都可以当数据库。

Git 的主要功能是处理纯文本内容的版本管理(简单说就是增删内容),当然可以用于管理纯文本类型的数据。
当然,我们大可用纯文本把数据保存在一个 Git 仓库里,程序需要的时候就去读一下,还可以上传 Git 服务器备份呢。
(题外话,这种用纯文本文件做数据库的方法叫 DirtyDB )

这么写的小项目确实跑的很愉快(甚至我有时都这么写),但在面临大规模用户使用(增删查改)的时候,可能会发生一些本来被数据库软件解决了的问题(例如队列、筛选、etc.)。


Git 的命令行输出可以用于查找更改的项目和内容,完全没问题,VSCode 的 Git 集成就是这么做的。

每次 Git 的执行都是独立的进程,问题来了,当我们的服务面临大量用户的时候,运行这些进程会不会造成一些有趣的混乱呢?
SunsetShimmer
2022-11-22 21:46:33 +08:00
总结起来,这个思路可行,就是有点小~糟糕。
andyJado
2022-11-22 21:57:34 +08:00
@andyJado
git commit-tree 不需要提交到 commit 上, 刚测试过了.

@beryl
我前天就是跟着这个走了一遍, 但其实 scm 的 git internal 更全面一点.
andyJado
2022-11-22 22:01:00 +08:00
@SunsetShimmer 感谢指点🙇
wxf666
2022-11-22 22:04:50 +08:00
@andyJado

1. 怎么存储 用户 的 提醒通知(及其是否已读)、历史消费、收藏节点 /主题、关注 /block 的用户?
2. 怎么知道 帖子 有哪些 回复?(回复所属的帖子)
3. 怎么知道 某个回复 有哪些“感谢回复者”记录?
4. 怎么搜索 某个用户 所有帖子、回复?
andyJado
2022-11-22 22:06:16 +08:00
@GeruzoniAnsasu

git 的数据结构一点不复杂哈,immute 三个半, 还有一个 mut 指针, 没啥了, 复杂度不在这吧.

>它能为现实需求的各种离散数据建立起相互映射,以便能从一套数据查询到另一套数据

学习了学习了!🙇
andyJado
2022-11-22 22:12:33 +08:00
@wxf666

这都是后端做的事情吗! 我带着问题学习学习再来回复, 受教了, 感谢提问🙇

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

https://ex.noerr.eu.org/t/897127

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

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

© 2021 V2EX