0

我们有 1000 万用户,可以与 150 万种产品进行交互。

在 dynamodb(NoSQL 数据库)中,我们有这样存储的用户友谊:

朋友桌

user_id    |    friends
1          |    [2, 3, 4]
2          |    [1,5]
3          |    [1, 4]
4          |    [1, 3, 5]
5          |    [2, 4]

在 Amazon RDS(SQL 数据库)中,我们有交互:

交互表

row  |   user_id   |   product_id
1    |      1      |      1
2    |      1      |      2
3    |      3      |      3
4    |      4      |      3

到目前为止,当用户访问产品页面时,他们可以看到与该产品进行过交互的朋友。这很容易计算!

但是,如果我们也想向他们的朋友展示朋友怎么办?

对数据库进行建模以实现这一目标的最佳方法是什么?我们可以完全改变数据库结构,做一些数据预处理等。

提前致谢。

4

1 回答 1

3

坦率地说,我不明白为什么要将这些关系数据存储在 Dynamo 中。user_id 到friends 表正在表达一种关系,最好在关系数据库结构中建模。在这种数据存储中,通过使用表上的自联接来确定朋友的朋友变得微不足道。

该表可能看起来像这样(假设“朋友”是从您的示例数据中显示的双向关系)

user_1    user_2
1         2
2         1
1         3
3         1
1         4
4         1
...

请注意,这是一个多对多连接表,其中每个朋友关系由两行描述(每个方向的关系)。

这在查询朋友的朋友时变得很重要,因为您希望能够简化为单个可索引的查询。换句话说,您不需要潜在地查询表两次以查看每个方向的关系 - user_1 和 user_2 没有特定含义。

查询可能如下所示:

SELECT DISTINCT
    t2.user2
FROM table AS t1
INNER JOIN table AS t2
  ON t1.user_2 = t2.user_1
WHERE t1.user_1 = ?

?有问题的用户 ID 在哪里。

使用表时,您需要确保关系插入/删除是原子的,即一次影响 2 行。

插入可以通过如下查询来实现:

INSERT INTO table (user_1, user_2) VALUES (1,2),(2,1)

删除可能看起来像

DELETE FROM table WHERE (user_1 = 1 AND user_2 = 2) OR (user_2 = 1 AND user_1 = 2)
于 2015-10-01T18:42:21.887 回答