Sorting 系统设计:如何支持通过相当任意的函数对大量记录进行排序

Sorting 系统设计:如何支持通过相当任意的函数对大量记录进行排序,sorting,database-design,architecture,nosql,Sorting,Database Design,Architecture,Nosql,假设,您被要求构建一个系统,在这个系统中,您将拥有大量记录(数十亿?),每天会增加数百万条记录。这些记录具有w、v、x、y、z等属性。您希望设计一个以这些记录的视图为中心的应用程序,该视图按某个函数F排序,该函数接受x、y和某些值a、b,这些值不属于记录的一部分,并且在插入时是未知的。排序不必是100%严格的,但是对于视图Ri和视图F(xi,yi,a,b)>F(xi-1,yi-1,a,b)中的Ri-1中的每一对记录,概率都很高 例如,如果您想在Instagram中添加一个“附近”视图(其中有一组

假设,您被要求构建一个系统,在这个系统中,您将拥有大量记录(数十亿?),每天会增加数百万条记录。这些记录具有w、v、x、y、z等属性。您希望设计一个以这些记录的视图为中心的应用程序,该视图按某个函数F排序,该函数接受x、y和某些值a、b,这些值不属于记录的一部分,并且在插入时是未知的。排序不必是100%严格的,但是对于视图Ri和视图F(xi,yi,a,b)>F(xi-1,yi-1,a,b)中的Ri-1中的每一对记录,概率都很高

例如,如果您想在Instagram中添加一个“附近”视图(其中有一组照片),该视图将显示一个照片列表,这些照片按与用户的接近程度和照片的新鲜度(例如最近发布的照片)排序。 所以在这个例子中,x和y是照片位置和创建时间戳;a和b是用户的位置和当前时间戳

你将如何设计这样一个系统?你会问什么问题?是否有一些数据存储组合对这类事情有好处

如果希望视图在添加新记录时以接近实时的方式更新,设计将如何更改? 有没有研究过类似问题的论文或文章


注意:我实际上并没有在Instagram工作,也没有做任何与这个问题相关的事情。只是想满足一种好奇心。

我添加了一个答案,因为我无法将其放在评论区。首先,我不会为此使用RDMS。我会使用像Neo4j这样的图形数据库。当使用图形数据库对系统进行建模时,通常从一张新的纸开始,问自己数据库应该回答什么问题。思维过程提供的是你的领域中固有的实体。它是将在图形中表示为节点的实体

一旦拥有了实体及其关联属性(类似于RDMS类型系统中的列),就可以开始定义实体之间的关系。在典型的RDMS类型系统中,指定的典型关系是与引用完整性有关的关系(无聊、打哈欠、打哈欠、打哈欠)。图形数据库允许您指定的关联/关系不止这些。在您附近的示例中,对于每个关联,我可以指定用户和照片之间的接近度值。然后,您可以使用Cypher语言查询满足某种邻近谓词的所有节点


最后,在可伸缩性方面,Neo4j可扩展到数十亿个节点。

您是否使用Neo4j进行过任何研究/原型设计?没有,但只是通过一些快速的谷歌搜索,它似乎有助于进行图形搜索。我可能很难理解,但是如何将上面的问题建模为一个图形?但是您只知道用户在查询时的位置,而不知道节点插入时的位置。我想你可以通过将用户位置的精度降低到邮政编码或其他东西,并在图形中使用边连接邮政编码节点,以距离作为权重来近似这一点。哦,对了,我知道你现在正在尝试构建什么了。你的问题有点抽象。所以你想根据用户的当前位置来显示一个照片列表?如果是这样,您的图形数据库中已经有了表示这些实体的节点,即用户节点、用户位置节点。当您对用户位置进行实时更新时,您必须对节点之间的关系进行实时更新;我以前从未做过这种类型的处理,所以请与Neo4j人员确认这是否容易且快速。然后,只需重新运行查询即可。