4

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

 1 year ago
source link: https://www.v2ex.com/t/897127
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

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

  andyJado · AndyJado · 12 小时 19 分钟前 · 3960 次点击

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

第 1 条附言  ·  11 小时 25 分钟前

老师们我错了我以为我换行了🧎

一行 sql 也没写过不知道为啥要用这玩意

blob tree grep awk 各种 pipe 倒是一点不怵

我感受不到任何 crud 比 git 更好用的(个人感受

github 就是拿 git 当数据库的, 对吧?(摆事实

##补充一点儿:
我个人生产所以内容全都会 git 管理, 索引查询内容都会用正则表达式匹配

##意图:
这个帖子出发点出于“如果我自己不用, 我为什么要用在别人身上?”
72 条回复    2022-11-23 04:49:33 +08:00
likunyan

likunyan      12 小时 15 分钟前

数据结构吧
qistchan

qistchan      12 小时 14 分钟前   ❤️ 1

有用 svn 当数据库的
ql562482472

ql562482472      12 小时 13 分钟前

api 不好用
zoharSoul

zoharSoul      12 小时 12 分钟前   ❤️ 1

以前有无数据库后端服务 很久很久很久以前
yohole

yohole      12 小时 11 分钟前

这应该是两个毫无相关的事情的吧,一时不知道怎么吐槽
hxndg

hxndg      12 小时 11 分钟前   ❤️ 1

我对数据库的稳定性不太了解,不过单就 git ,我平均每周一次处理 git break 的事情。。。。

但是为啥会出问题到现在还没明白,都是阿里云的 ecs 实例,看日志也没啥事情。。。。
singerll

singerll      12 小时 10 分钟前

石头虽然也可以砸钉子,但跟锤子还是有区别的。
tool2d

tool2d      12 小时 10 分钟前

我是觉得 sql 降低了一点门槛,让那些不怎么会编程的人,也能用用数据库,写写简单查询语句。
SuperMild

SuperMild      12 小时 8 分钟前 via Android

每个人都已经拿 git 当数据库了呀,广义来说一个文本文件都可以是一个数据库,如果你说这不算数据库,那么你就要说说你特指什么数据库了。
lakehylia

lakehylia      12 小时 6 分钟前

对对对,你说的对,你是这条街最靓的仔。
pierswu

pierswu      12 小时 3 分钟前

因为你们如果用 git 做数据库,就要再自己做一套数据库底层,而且还不一定做的好
Mark24

Mark24      11 小时 59 分钟前   ❤️ 1

建议了解下 git 底层原理、数据库底层原理。

这是 思而不学则殆。
SoulSleep

SoulSleep      11 小时 51 分钟前

有道理,万物皆可数据库...
Bootis

Bootis      11 小时 50 分钟前

钓鱼还是?
Bootis

Bootis      11 小时 50 分钟前   ❤️ 3

@Bootis 如果不是钓鱼建议转行
AlohaV2

AlohaV2      11 小时 48 分钟前

git 会存一堆版本的 snapshot ,如果数据更新的频率比较高且数据量大,历史负担会非常重
rozbo

rozbo      11 小时 48 分钟前

wangnimabenma

wangnimabenma      11 小时 48 分钟前

git 本来就是一个 K,V 库

你感觉不到 sql 的好只是你知道的还太少
sarices

sarices      11 小时 48 分钟前   ❤️ 2

当我知道原始人用绳结当数据库的时候我已经觉得有问题了,一行 sql 也没写过不知道为啥要用这玩意
lookStupiToForce

lookStupiToForce      11 小时 42 分钟前

且不说这是两个层面的事情两种大类需求,或者 git 怎么实现 acid 、联表查询、索引树这些底层的玩意儿

单是 git 管理大量的代码或者大容量文件,不分片,你就要抓瞎吐血
不信你试试用 git 去管理一下上十 GB 的项目,或者去管理几个 GB 级的 csv ,或者几百上千个 10MB 级的 csv
这点数据量对任意数据库都是小 case ,对 git 而言就是开发中更新一下都谈不上效率更不可能用于生产

什么?你说给 git 加 feature 加额外的数据结构来实现这些需求?那我为什么不直接用数据库呢?

另外用于数据库版本管理的工具已经有了 -> flywaydb.org
tusj

tusj      11 小时 39 分钟前

数据量小,业务简单(学生作业级,玩具 demo 级)怎么折腾都可以。想想数据库发明之前,反正就折腾嘛
数据量一大,要上生产,要事务,要并发,要多地热备,各种问题就来了
kalman03

kalman03      11 小时 36 分钟前

你说的是 binlog 吧
wangnimabenma

wangnimabenma      11 小时 33 分钟前

@kalman03 #24 undo log
jewelz

jewelz      11 小时 26 分钟前

安全无虞 性能捉急啊 商业数据库也要响应速度的啊
meeop

meeop      11 小时 24 分钟前

看业务,我觉得有些场景下可以
anlythree

anlythree      11 小时 22 分钟前

我需要存下商品的价格和联系方式和名称和创建时间吧,然后需要随时查看最新的 10 条商品,,,用 git 怎么实现????
xgfan

xgfan      11 小时 17 分钟前 via iPhone

Git 怎么当数据库用?分支作为表,每个 commit 作为 key ,里面的 msg 作为值?我想象力不够……

难道你说的是把一个文本文件作为数据库?
jasonkayzk

jasonkayzk      11 小时 16 分钟前

槽点太多,我竟然都不知道该怎么说了。🤯
JohnBull

JohnBull      11 小时 13 分钟前

我记得还有过拿 github 当网盘用的方案呢,后来被站方禁了
banmuyutian

banmuyutian      11 小时 12 分钟前

一时无法分清是不是反串
JasonLaw

JasonLaw      11 小时 9 分钟前 via iPhone

不好意思,我看不懂你在说什么。🤕
ljrdxs

ljrdxs      11 小时 8 分钟前

关系型数据库的关系,你知道是什么吗?
weichengwu

weichengwu      11 小时 4 分钟前

ArianX

ArianX      11 小时 1 分钟前

git 本身只对数据做版本控制,没有任何结构化组织数据、抽象数据的方式吧,因此不能叫做数据库。

当然如果只要能存数据就叫做数据库,那文本也能看作数据库。。
ArianX

ArianX      10 小时 59 分钟前

github 也没有提供一个大的 git 仓库用来存取数据吧?只是把每个 git 仓库看作一个实体给用户展示。我猜 github 本身可能有单独的数据库用来存每个 git 仓库
gstqc

gstqc      10 小时 56 分钟前   ❤️ 1

以前还有个帖子的老哥说,RDBMS 和 NoSQL 都是垃圾
自己写项目就用 txt 文档存数据呢
你这 git 有点落后了
wangxiaoaer

wangxiaoaer      9 小时 40 分钟前

“github 就是拿 git 当数据库的, 对吧?(摆事实”

你不会以为 GitHub 的后台就是一个仓库一个文件夹就完事儿了吧。
iloveMonica

iloveMonica      9 小时 39 分钟前

excel 也算数据库吧
superrichman

superrichman      9 小时 33 分钟前 via Android

@dacapoday 太酷了
nulIptr

nulIptr      9 小时 19 分钟前

我大一的时候就想到这个问题了,ini 也能存数据,要数据库干球
andyJado

andyJado      8 小时 35 分钟前

@anlythree
把商品当作 commiter, 它 commit(入库抽象为 commit?)自带名称,时间,联系方式的鸭.

查看最近的十条提交不难吧?
andyJado

andyJado      8 小时 32 分钟前

@wangxiaoaer

@ArianX

但是你在 github 里面查看 blame 鸭, diff 鸭, commit history 鸭, 这些都是服务器端的 git 操作吧?
这些还能是 github 重写的逻辑? 如果不是的话, 那我用 git 做后台这些功能我就是相当于免费获得的嘛.
andyJado

andyJado      8 小时 31 分钟前

@ljrdxs 我一行 sql 都没写过, 我当然不知道, 不知道才来问啊.
wxf666

wxf666      7 小时 53 分钟前

@andyJado 比如 V 站的 1K 个节点、60W 个用户、90W 个帖子、1200W 个回复,

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

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

怎么在 Git 里存储呢?


增删查改 节点、用户及个人信息、帖子、回复、提醒、消费 等,大概咋实现呢?
idblife

idblife      7 小时 44 分钟前 via iPhone

太年轻呗,没见过世面
deplivesb

deplivesb      7 小时 37 分钟前

我看了下 op 的历史帖子和发言,我只能说。。。。不怕无知,就怕不知道自己无知
GeruzoniAnsasu

GeruzoniAnsasu      7 小时 30 分钟前   ❤️ 1

不如…… 你写几行 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

andyJado      7 小时 28 分钟前

@wxf666

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

这样可以完全避开系统调用, 所有事情只发生在.git/objects/里
ksedz

ksedz      7 小时 23 分钟前

有类似思想的数据库
https://irmin.org
A distributed database built on the same principles as Git

SQL 还是强在足够表达力的基础上标准化程度高吧
SunsetShimmer

SunsetShimmer      7 小时 21 分钟前

如果不考虑效率和实现难度,什么都可以当数据库。

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

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


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

每次 Git 的执行都是独立的进程,问题来了,当我们的服务面临大量用户的时候,运行这些进程会不会造成一些有趣的混乱呢?
SunsetShimmer

SunsetShimmer      7 小时 20 分钟前

总结起来,这个思路可行,就是有点小~糟糕。
andyJado

andyJado      7 小时 9 分钟前

@andyJado
git commit-tree 不需要提交到 commit 上, 刚测试过了.

@beryl
我前天就是跟着这个走了一遍, 但其实 scm 的 git internal 更全面一点.
wxf666

wxf666      7 小时 1 分钟前

@andyJado

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

andyJado      7 小时 0 分钟前

@GeruzoniAnsasu

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

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

学习了学习了!🙇
andyJado

andyJado      6 小时 54 分钟前

@wxf666

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

kkwa56188      6 小时 48 分钟前

虽然 kv nosql 也可以叫数据库, 但正儿八经的数据库 是 关系数据库.
去 leetcode 里, 做完 三道简单的 "数据库" 的题目, 先.
wxf666

wxf666      6 小时 35 分钟前

@andyJado

以及,怎么确保『用户消费货币 和 用户发帖 /回复』同时发生或不发生?(防止突然断电、程序突然崩溃等)

这些都是最最最基础的数据库功能,连 1MB 的 SQLite 都能轻易实现


可能数据量太大(而且没有数据),你不好练习

可以去搜索一下『 SQL 经典 50 题』,一些基于『十来行学生、课程、教师、成绩数据』的各种查询,看看怎么用 Git 实现?
8zip

8zip      6 小时 18 分钟前 via Android

Json 也能当数据库的,csv 甚至 txt 也行
jim9606

jim9606      6 小时 16 分钟前

你确实可以把 git 当数据库用,如果你了解 git 的底层实现,你就知道它底层其实就是一个 kv 数据库。
但是,如果你真的只是需要一个 kv 数据库而不需要 git 针对版本管理做的业务封装,一般都会有更好的选择。

真有点复杂度的业务不会纯拿 bash 和 coreutils 来写,因为数据处理和错误处理太蛋疼了,换成 python 都会省事些。但在业务不复杂的时候,shell 的低耦合易部署的好处就比较重要了。

你现在觉得 sql 没用,是因为你还没遇到达到那种复杂度的需求。
mikewang

mikewang      6 小时 10 分钟前 via iPhone   ❤️ 1

这句话本身就有问题,就好比问“为什么我们不把牙医当作医生”一样(举个例子)。
因为牙医本身就是医生;而 Git 的核心本身也就是一个数据库。

数据库的范围可能比你想象的要大:即使你想“不用数据库”以文件存储处理数据,然而整个文件系统它也是一个数据库。

同样地,你不能把牙医当全科医生对待,也不能将 Git 当一般数据库用。不是没有可能,而是各有各的擅长之处。
Tink

Tink      6 小时 1 分钟前 via Android

为什么不用 excel 当数据库
DeWjjj

DeWjjj      6 小时 0 分钟前

以前有文本流的,但是一旦东西多了必须上数据库。
不然数据的问题,会卡死你。
adoal

adoal      5 小时 5 分钟前

因为你构想出来的用 git 当数据库的场景都很简单。当业务需要复杂的查询和复杂的写入事务,你要给简单操作加上各种一致性约束和保障,加上各种索引,做各种在简单场景下可能是负面操作但复杂场景下反而是优化的设计,最后大概率重新发明关系数据库。
adoal

adoal      5 小时 0 分钟前

Unix pipe 串起来各种神操作,对于流式数据处理很好用。但在数据量大时,如果需要中途“倒车”,需要各种分组聚合,就麻烦大了。
adoal

adoal      4 小时 59 分钟前

按 V2 以前常看到劝人找个正经工作上班的说法……你先找个正经数据库作业做一遍看看呗。
msg7086

msg7086      3 小时 2 分钟前 via Android

git 本来就是一个数据库。再往前,svn 也是一个数据库。再往下,文件系统也是一个数据库。但是你跑业务可不只是要一个数据库。你平时用的是 rdbms ,关系型数据库,是表格型的,而且要符合 acid ,而且对数据完整性,并发性,查询速度以及读写性能都有很高的要求,git 这速度已经很慢了。你会主动选一个比 MySQL 慢 100 倍的数据库吗?
chengxiao

chengxiao      17 分钟前

我是受够了 拿 Github 当数据库的人了,一大堆人拿日记,小说往里灌内容,导致 github 的中文搜素,全是垃圾

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK