Database 此数据集的最佳数据库是什么?
我有一个应用程序(针对给定的twitter用户),它可以获取一个twitter用户列表,您可以跟踪,但不会跟踪您。它是这样做的: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
- 比较两个列表,一个来自时间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是数组的大小。因此,我们应该使用一些智能数据结构来高效地存储它们 我提出了以下方法:
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 xSDIFF ids_at_time_y ids_at_time_x
SDIFF最好的地方在于它的运行效率非常高-
时间复杂度为O(N),其中N是系统中元素的总数
这两套。即使您执行2个diff操作,时间复杂度也会降低
仍然是线性的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
)检索列表您仍然可以将重要数据存储在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
}
}