database-design - 为设计 Instagram 问题寻找最佳数据库设计
问题描述
我正在阅读链接中给出的帖子: https ://www.education.io/courses/grokking-the-system-design-interview/m2yDVZnQ8lG 。我在理解数据库模式部分有很多困难:
现在,本节建议将照片的元数据存储在像 cassandra 这样的 nosql 存储中。
问题是:
- 参考下面的行,将列表存储在不同的列中究竟是什么意思?
对于“UserPhoto”表,“key”是“UserID”,“value”是用户拥有的“PhotoID”列表,存储在不同的列中。
- 虽然它建议使用 nosql 存储,但这对 rdbms 到底有什么用处?
我花了无数时间试图思考和搜索这两个问题。请帮忙。
解决方案
...将列表存储在不同的列中究竟是什么意思?
我假设表模式看起来像:
CREATE TABLE user_photos
userid text,
photoid int,
photopath varchar,
...
PRIMARY KEY (userid, photoid)
)
表PRIMARY KEY
的分区键作为userid
聚photoid
簇列。这意味着表中userid
的每条记录(由 标识)将具有photoid
(聚类列)的多个“行”,因为每个用户都可以拥有多张照片。
Cassandra 被称为宽列存储,因为数据存储在“宽列”中,这意味着列会根据需要重复一次或多次。为了说明使用上面的示例,下面是记录如何存储在磁盘上的表示:
+----------+-----------+-----------+-----+-----------+
| PK | Column 1 | Column 2 | ... | Column n |
+----------+-----------+-----------+-----+-----------+
| userid = | photoid = | photoid = | ... | photoid = |
| 'abc123' | 56789012 | 78901234 | ... | 90123456 |
+----------+-----------+-----------+-----+-----------+
每条记录可以有一列或一百列。这取决于用户拥有多少张照片。它不像传统的 RDBMS 表那样具有固定数量的列。
虽然它建议使用 nosql 存储,但这对 rdbms 到底有什么用处?
NoSQL 数据库的许多用例无法在传统的二维 RDBMS 表中建模(列在顶部,行在页面下方)。
如上例所示,Cassandra 既支持传统的二维表,也支持多维表。
但更重要的是,RDBMS 无法像 Cassandra 这样的数据库那样实现规模化。您可以在 Cassandra 集群中拥有数百或数千个节点,并且您可以将节点分布在全球各地。NoSQL DB 和 Cassandra 中有很多特性和属性是 RDBMS 无法实现的。干杯!
推荐阅读
- signalr - 如何在后台导入excel文件并在文件上传后获取报告?
- javascript - 将函数写入console.log,如何传递多个值?
- nmap - 使用 python-nmap 确定主机的操作系统
- ansible - 根据输入转换 ansible 变量值
- python-3.x - 如何从python中数据框中的所有工作表中删除重复项
- reactjs - 通过传递状态异常调用反应组件
- c# - C#通过连接字符串创建类
- java-8 - 无法将 JavaFX Datepicker 日期转换为指定的日期格式
- oracle - 如何使用 SET_BLOCK_PROPERTY 突出显示特定记录
- javascript - JS - 如何处理文件名中的空格?