首页 > 解决方案 > 为设计 Instagram 问题寻找最佳数据库设计

问题描述

我正在阅读链接中给出的帖子: https ://www.education.io/courses/grokking-the-system-design-interview/m2yDVZnQ8lG 。我在理解数据库模式部分有很多困难:

https://www.education.io/courses/grokking-the-system-design-interview/m2yDVZnQ8lG#div-stylecolorblack-background-colore2f4c7-border-radius5px-padding5px6-database-schema

现在,本节建议将照片的元数据存储在像 cassandra 这样的 nosql 存储中。

问题是:

对于“UserPhoto”表,“key”是“UserID”,“value”是用户拥有的“PhotoID”列表,存储在不同的列中。

我花了无数时间试图思考和搜索这两个问题。请帮忙。

标签: database-designcassandrainstagram

解决方案


...将列表存储在不同的列中究竟是什么意思?

我假设表模式看起来像:

CREATE TABLE user_photos
  userid text,
  photoid int,
  photopath varchar,
  ...
  PRIMARY KEY (userid, photoid)
)

PRIMARY KEY的分区键作为useridphotoid簇列。这意味着表中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 无法实现的。干杯!


推荐阅读