Database 此数据集的最佳数据库是什么?

Database 此数据集的最佳数据库是什么?,database,database-design,redis,Database,Database Design,Redis,我有一个应用程序(针对给定的twitter用户),它可以获取一个twitter用户列表,您可以跟踪,但不会跟踪您。它是这样做的: 比较两个列表,一个来自时间x,另一个来自时间y,看看是否有更多的人跟随你回去,还是更少 看看twitter用户x跟踪你花了多长时间 查看用户x跟踪您需要多少转发/评论 我想到的最简单的方法就是与用户和不跟踪你的人建立一种“有很多属于”的关系,例如: User table -id TwitterUser table -user_id -timestamp -is

我有一个应用程序(针对给定的twitter用户),它可以获取一个twitter用户列表,您可以跟踪,但不会跟踪您。它是这样做的:

  • 比较两个列表,一个来自时间x,另一个来自时间y,看看是否有更多的人跟随你回去,还是更少
  • 看看twitter用户x跟踪你花了多长时间
  • 查看用户x跟踪您需要多少转发/评论
我想到的最简单的方法就是与用户和不跟踪你的人建立一种“有很多属于”的关系,例如:

User table
-id

TwitterUser table
-user_id 
-timestamp
-isFollowing
因此,使用SQL模式,我可以获得给定用户的所有非后续用户,并且可以通过时间戳对它们进行比较,以匹配上述需求

然而,我希望有一个比sql数据库更好的DB后端来表示这个数据集。我一直在尝试w/redis,但不确定如何实现它

我在想也许一个文档存储—b/c—我只想区分两个数据集。或者更准确地说:我想区分两个twitter用户ID列表


有什么想法吗?

neo4j(http://neo4j.org)是为将数据存储为图形而构建的数据库引擎。我没有任何实际使用neo4j的经验,但它似乎非常适合。比较两个数组的Bruteforce方法的时间复杂度为O(N*M),其中N和M是数组的大小。因此,我们应该使用一些智能数据结构来高效地存储它们

我提出了以下方法:

  • “twitter ID列表”是一个集合,因为ID是唯一的。Redis支持 设置并允许执行设置操作,如差异。假设 您有两套钥匙,分别是
    ids\u at_time\u x
    ids\u at_time\u y
    。 使用
    SADD
    像这样:

    SADD ids_at_time_x "15424"
    
    当您准备好执行差异执行时

    SDIFF ids_at_time_x ids_at_time_y
    
    这将从
    ids\u\u time\u x
    返回一个不存在的ID列表 在时间上出现在ID中。如果要进行反向操作, i、 e.检索在\u时间\u x
    SDIFF ids_at_time_y ids_at_time_x
    
    SDIFF最好的地方在于它的运行效率非常高- 时间复杂度为O(N),其中N是系统中元素的总数 这两套。即使您执行2个diff操作,时间复杂度也会降低 仍然是线性的

  • 将它们存储为已排序的列表。Redis支持排序集。添加时 id您必须包含元素的分数(Redis将根据分数进行排序),该分数等于您的 案例:

    当列表准备好后,我们检索它们并在中进行比较 代码。以下是伪代码:

    n = size of A
    m = size of B
    i = 0
    j = 0
    setA = [] // List of elements that present only in A
    setB = [] // List of elements that present only in B
    intersection = [] // List of elements that present in A and B
    
    while i < n or j < m {
      if j == m {
        setA.add(A[i])
        i = i + 1
      } else if i == n {
        setB.add(B[j])
        j = j + 1
      } else if A[i] < B[j] {
        setA.add(A[i])
        i = i + 1
      } else if B[j] < A[i] {
        setB.add(B[j])
        j = j + 1
      } else {
        intersection.add(A[i])
        i = i + 1
        j = j + 1
      }
    }
    
    n=一个文件的大小
    m=B的大小
    i=0
    j=0
    setA=[]//仅在
    setB=[]//仅在B中存在的元素列表
    交集=[]//存在于A和B中的元素列表
    当i
    说明:我们使用A和B被排序的事实。我们有两个索引,都从零开始。比较 A和B的两个前元素。如果A[0]小于B[0],我们知道 [0]只存在于A中,因此我们将其添加到列表setA和 将A的索引增加1。如果B[0]小于A[0],则添加B[0] 到列表setB并将B的索引增加1。如果A[0]==B[0]我们 将[0]添加到交叉点列表中,并增加两个索引。 该代码也适用于线性时间O(N),其中N是 A和B中的元素

    请注意,这种方法适用于任何可以返回排序列表的数据库,这意味着您可以将其存储在传统的SQL数据库中,并使用
    orderbytwitter\u id
    )检索列表

  • 看看Redis支持的所有命令及其完整列表,它们都有很好的文档记录。Redis也有多种语言的官方客户端,所以这应该不是问题。
    您仍然可以将重要数据存储在SQL数据库中,并让Redis处理ID列表。

    为什么您认为这是一种很好的图形表示法?一组Twitter用户以及他们之间的关系本质上形成了一个有向图,其中每个用户都是一个节点,每个跟随关系都是从一个节点到另一个节点的边。好的,但是你认为一个图表仍然适用吗,因为我只是在时间x,y,z拍一张快照。。。一个用户a的朋友谁没有跟进?非常有趣的回应-谢谢。我还没有考虑增长率分析,但这是一个非常重要的考虑因素。我正在考虑您的第一个设计,但是如果我想将一组id与一个用户关联,我是否应该将用户id添加到密钥中?e、 g.:SADD user_a_ids_at_time_x“15424”还是那是糟糕的redis设计?@eggie5在密钥中包含用户id是完全有效的。通常,程序员使用
    作为分隔符,因此保存集合的键可能遵循类似
    user:$USERID:ids:$UNIXTIMESTAMP
    的模式,例如:
    user:153343:ids:133793933
    。使用类似的模式,您将能够动态构造键。对于初学者来说,这是一本很好的读物。我将看一看twitter克隆示例和密钥方案。暂时忘掉redis和persistance,让我们从数据模型中的对象开始。我会做得更简单,首先使用following和followers集合(id数组),然后使用ruby(我的环境)和set逻辑来派生其他有用的集合。例如,这两个集合的交集就是我正在跟踪并跟踪我的集合。那些没有跟踪我的人将是跟踪和跟踪的区别。例如:(ruby)following=twitter\u client.friend\u id(user\u id)。ids followers=twitter\u client.follower\i
    n = size of A
    m = size of B
    i = 0
    j = 0
    setA = [] // List of elements that present only in A
    setB = [] // List of elements that present only in B
    intersection = [] // List of elements that present in A and B
    
    while i < n or j < m {
      if j == m {
        setA.add(A[i])
        i = i + 1
      } else if i == n {
        setB.add(B[j])
        j = j + 1
      } else if A[i] < B[j] {
        setA.add(A[i])
        i = i + 1
      } else if B[j] < A[i] {
        setB.add(B[j])
        j = j + 1
      } else {
        intersection.add(A[i])
        i = i + 1
        j = j + 1
      }
    }