阿里网盘的跨用户故障和数据库选型

news/2024/9/19 2:15:56/文章来源:https://www.cnblogs.com/inshua/p/18417747

这两天阿里云网盘出现故障,可以访问其它用户的文件。这在商业上是很可怕的。

这个故障是什么原因导致的呢?网上有一些说法。最可信的是 SQL 查询没写条件,查了所有的文件。

试想如果不是关系型数据库,在普通OO编程语言里,断不会发生这样问题,在OO语言里, user.files 就是他的文件,不可能访问到别人的文件。

class User{List<File> files
}

过去我也认为直接用SQL更好,ORM 最终也是SQL,何必脱裤子放屁。现在看来,如果阿里用了 ORM,这个问题就不会发生。

我们知道,RDB 和 OO 阻抗失配,那么就应该用和 OO 更适配的 NoSQL。对于个人服务,NoSQL 是更好的选择。SQL用于做数据分析更合适。

说到 RDB 这种数据全堆一起的问题,朋友一个公司在做 SaaS,该 SaaS 给每个公司准备一个单独的数据库,彻底隔离,用户不可能访问到其他用户的数据。这么一来有上千个客户就有上千个数据库,看起来很荒谬。的确,我们当时都震惊了。现在看来这种做法固然极端了一点,却也暴露出,关系型数据库的确有它的问题。

那么,RDB 有没有办法避免该问题呢?

问题来源我们可以简化理解为,系统里有用户表和文件表两个表,通过外键关联(即使没搞物理外键逻辑上必然有外键的):

User
id
File
id
user_id

从问题描述看,也可能有一个文件夹的事物,外键指向文件夹,这里就不深究了。

总之,所有用户的文件实际上放在同一个文件表。这是关系型数据库设计的基础观念。

幸运的是,有的关系型数据库是可以避免该问题的。这就是 PG。在 PG 里,有一个广泛使用的字段类型,数组。所以 PG 可以像 NoSQL 一样,在 User 表建文件 ID。

User
id
file_ids int[]
File
id

当然,后面依然有分页之类的课题等着我们,但这起码解决了集中存放的问题。

长期以来,阿里一直选用可怜的 MySQL 作为 DB 存储,又经常使用 MyBatis 之类裸 SQL 的技术方案,建议以该事故为把手进行深刻的复盘,审视在架构设计、数据管理以及技术选型上的决策,给出更为根本的解决方案。嗯。

让我们仔细看看问题到底出在哪儿?

上文说到,OO 和 FP 是一回事,FP 的要点是什么呢?我想稍微深入研究过的都知道:闭包。 FP 也好,OO 也好,实际上都提供了数据的 scope 机制。所有的数据都有 scope,scope 外要访问只能通过 public 或暴露函数等手段。

而 RDBMS 是没有 scope 的,尽管它能通过一类一表格一行一对象的方式表达对象,但这种方式本质上是一种降维技术,在降维过程中丢失了对象的 scope,于是对象全部变为了顶级的,也就是说没有了 scope 导致失去了封装,所以该问题是理论上必然导致的。

那么用 PG 或 NoSQL 就 OK? 这个问题问的很好,实际上都不够好,或者说还有很大的进步空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798857.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结对对对项目

结对对对项目这个作业属于哪个课程 软件工程课程这个作业要求在哪里 个人项目 - 作业 - 计科22级34班 - 班级博客 - 博客园 (cnblogs.com)这个作业的目标 按照要求写一个四则运算生成器成员一 3122004883许億驰任务列表1. 实现命令行程序:创建一个命令行程序,能够生成小学四则…

闯关提交02

任务:Python实现wordcount1 import re2 from collections import defaultdict3 4 def wordcount(text):5 # 将文本转换为小写6 text = text.lower()7 8 # 使用正则表达式分割单词9 words = re.findall(r\b\w+\b, text) 10 11 # 使用 defaultdict…

M:接口耗时很短,页面数据回显慢?

1、页面卡顿,需要好长一段时间才能加载完成,可能是资源请求过多,再加上请求响应慢的原因。 每个浏览器都有资源请求并发数的限制,如何查看请求阻塞情况 到前端如何针对该限制进行优化? 先看问题: 1、设置服务端请求耗时(3S)客户端并发调用20个请求。(预留问题-见下方:…

中秋 -2024/9/17

今天是中秋假期最后一天,今天主要学习了动态规划算法,写了几个模板题 新算法学了迪杰斯特拉(Dijkstra)算法,只是过程了解了过程,还是不能用代码描述出来 寻找最短路径的算法

干盛辉的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 介绍自己并进行评估,阐明自己的技能、薄弱点,表明期望的课程收获以及课程实践角色扮演姓名-学号 干盛辉-2022329301011一、自我介绍 (1)个人信息 大家好,我叫干盛辉,来自于浙江温州,是 22…

vscode配置java简易教程

java的新手快速配置一、下载jdk java官方地址:https://www.oracle.com/java/technologies/downloads/ 选择适合自己电脑的版本,并下载到一个自己喜欢的地方。二、配置环境变量 记住自己 jdk 的地址,例:我的 jdk 下载到了 D:\app\java 1、JAVA_HOME配置 点击 win 键后,搜索…

GitHub 配置 ssh key 的步骤及原理解释

原文:Github 配置 ssh key 的步骤(大白话+包含原理解释)本文涉及 SSH 相关知识,建议先阅读 SSH 原理与运用(一):远程登录 或者将其作为扩展资料。 前言 在 GitHub 上配置 ssh key 很容易,网上一大堆教程,但基本没有详细解释其原理的,为什么要配?每使用一台主机都要配…

贪吃蛇作业

贪吃蛇界面: 代码:import pygame import random import sys import tkinter as tk from tkinter import messagebox # 初始化pygame pygame.init() # 设置屏幕大小 screen_width = 640 screen_height = 480 screen = pygame.display.set_mode((screen_widt…

数据集的收集

我在这里找到了一个数据集的网站:https://www.kaggle.com/datasets 我这里找到了三个小数据集为例子分别如下: 我写的数据分析如下: 1.数据集名称房价回归数据集来源 https://www.kaggle.com/datasets/prokshitha/home-value-insights?resource=download数据集描述该数据集…

数字签名是什么?

原文:数字签名是什么?文中涉及的密码学基本知识,可以参见对称加密和非对称加密的区别。鲍勃有两把钥匙,一把是公钥,另一把是私钥。鲍勃把公钥送给他的朋友们——帕蒂、道格、苏珊——每人一把。苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效…

存储论——确定性存储模型模型精解

运筹学中的存储问题主要研究如何通过优化库存管理,确保在满足需求的同时,尽可能降低与库存相关的成本。这一问题在生产制造、物流运输、仓储等各个领域具有重要应用。核心目标是通过合理规划进货、存货和出货策略,实现成本最小化和资源的高效利用。在实际应用中,由于需求的…

软工实践第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253这个作业的目标 了解小型项目的设计学号 082100170github:完成情况因为对游戏设计没有多大兴趣,所以只是简单地完成了基本的消…