为设计 Instagram 问题寻找最佳数据库设计

Finding the best db design for design Instagram problem

我正在阅读 link 中给出的 post: https://www.educative.io/courses/grokking-the-system-design-interview/m2yDVZnQ8lG。 我在理解数据库架构部分时遇到了很多困难:

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

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

问题是:

For the ‘UserPhoto’ table, the ‘key’ would be ‘UserID’, and the ‘value’ would be the list of ‘PhotoIDs’ the user owns, stored in different columns.

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

... what exactly does it mean by that storing the list in different columns?

我假设 table 架构类似于:

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

table 的 PRIMARY KEY 具有分区键 useridphotoid 作为集群列。这意味着 table 中的每条记录(由 userid 标识)将具有 photoid 的多个“行”(聚类列),因为每个用户可以有多张照片。

Cassandra 被称为宽列存储,因为数据存储在“宽列”中,这意味着列会根据需要重复一次或多次。为了使用上面的示例进行说明,下面是记录如何存储在磁盘上的表示:

+----------+-----------+-----------+-----+-----------+
| PK       | Column 1  | Column 2  | ... | Column n  |
+----------+-----------+-----------+-----+-----------+
| userid = | photoid = | photoid = | ... | photoid = |
| 'abc123' | 56789012  | 78901234  | ... | 90123456  |
+----------+-----------+-----------+-----+-----------+

每条记录可以有一列,也可以有一百列。这取决于用户有多少张照片。它不像传统的 RDBMS tables.

那样固定列数

While it recommends, using a nosql store, how exactly will this be useful over a rdbms?

NoSQL 数据库的许多用例无法在传统的二维 RDBMS tables 中建模(顶部的列 运行,底部的行 运行页)。

如上例所示,Cassandra既支持传统的二维table,也支持多维table。

但更重要的是,RDBMS 无法像 Cassandra 这样的数据库那样实现规模化。您可以在 Cassandra 集群中拥有数百或数千个节点,并且可以将节点分布在全球范围内。 NoSQL DB 和 Cassandra 中有许多 RDBMS 无法实现的特性和属性。干杯!