02 关联数据的存储选择

2019-10-08  本文已影响0人  武漂的小丙

1 关系型数据库缺少联系

1569376334528.png

举例一个记录朋友关系的简单的连接设计,

1569392222689.png
SELECT p1.Person
FROM Person p1 JOIN PersonFriend
    ON PersonFriend.FriendID = p1.ID
JOIN Person p2
    ON PersonFriend.PersonID = p2.ID
WHERE p2.Person = 'Bob'
SELECT p1.Person
FROM Person p1 JOIN PersonFriend
    ON PersonFriend.PersonID = p1.ID
JOIN Person p2
    ON PersonFriend.FriendID = p2.ID
WHERE p2.Person = 'Bob'
SELECT p1.Person AS  PERSON, p2.Person AS FRIEND_OF_FRIEND
FROM PersonFriend pf1 JOIN Person p1
    ON pf1.PersonID = p1.ID
JOIN PersonFriend pf2
    ON pf2.PersonID = pf1.FriendID
JOIN Person p2
    ON pf2.FriendID = p2.ID
WHERE p1.Person = 'Alice' AND pf2.FriendID <> p1.ID

经过前面的分析,我们总结关系型数据库存在如下问题:

2 NoSQL数据库也缺少联系

NoSQL数据库如下都无关联的文档/值/列:

一种广为人知的添加联系的策略是在某个聚合数据(aggregate)中嵌入另一个聚合数据标识符,即添加外键,缺点是这需要在应用层连接聚合数据,其代价急速增加。

1569417382553.png

下面是一个用文档实现的使用聚合存储的小型社交网络:

1569886874366.png

为了避免处理整个数据集,我们可以增加反向指针,但这会违反规范化存储模型。

O符号作为描述一个算法的性能随数据集的大小而变化的简写方式。

3 图数据库拥抱联系

应用程序必须着手创建一个扁平的、无连接的数据之外的网络,然后再处理那些有反规范化存储导致的缓慢查询和延迟写入。关联数据被存储为关联数据,只要问题域中存在关联,数据中就存在关联,如下所示:

在图中对朋友、同事、工人以及(单相思)恋人关系的简单建模

图中的标签:

1570069070273.png

聚合存储和关系型数据库对于超出中等规模的集合操作表现得都不太好。

当我们试图从图中挖掘路径信息时,操作慢了下来。任何超出寻找直接朋友或是寻找朋友的朋友这样的浅遍历的查询,都将因为涉及的索引数量过的而是查找变得缓慢。

图数据库由于使用了免索引邻接,确保了遍历关联数据是非常迅速的

1570069647847.png

从数据从业者的角度来看,图数据库是处理如下特征数据集的最好技术:

4 小结

关系型数据库和NoSQL数据存储中的关联需要开发人员在应用程序层实现数据处理,而相比之下,关联在图数据库中则是一等公民。

上一篇下一篇

猜你喜欢

热点阅读