我正在建立一个网站,我需要确保"硬币的数量"和#34;用户"如果增长太快,不会杀死数据库。我首先在mathematica上发布了这个(认为它是一个数学网站,但发现它不是)。如果这是错误的地方,请告诉我,我会相应地移动它。但是,它可以归结为解决一个复杂的问题:如果用户增长得太快,我的数据库是否会爆炸?
问题在于:
我试图确认以下方程式是否适用于我的问题。问题是我有USERS(u),我有硬币(c)。
因此,实际上,DB中存储了数据库行:
trade_id | user_id | offer_id | want_id
1 | 1 | A | B
2 | 2 | B | C
所以在上面的数据结构中,用户1想要硬币A用于coint B,而用户2想要硬币B用于硬币C.这就是我建议存储数据的方式,我需要知道如果我得到1000个用户并且每个人都有15个硬币,如果每个用户将每个硬币提供给另一个用户,将在该表中建立多少关系。它会以指数方式爆炸吗?它可扩展吗?等?
如果2个用户拥有2个硬币,则用户1可以将其两个硬币与其他用户交换两个硬币,反之亦然。这使得它可以设置4种可能的贸易关系。但是,请记住,如果用户1为B提供A ...用户2不能为A提供B(因为该关系已经存在。
如何确定U用户和C币可以发生多少次交易?
目前,我有两种解决方案中的一种,但似乎都不是100%正确。到目前为止我有两个可能的方程式:
U! x C!
C x C x (U-1) x U
(其中C =硬币,U =用户);
有关获得更精确等式的任何想法?我怎么能毫无疑问地知道,如果我们每个10个硬币扩展到1000个用户,那么这个桌子不会爆炸成数百万个记录?
答案 0 :(得分:4)
如果我们只考虑有多少用户可以与其他用户交易。您可以使用允许的组合制作表格。
user 1
1 | 2 | 3 | 4 | 5 | 6 | ...
________________________________
1 | N | Y | Y | Y | Y | Y | ...
user 2 2 | Y | N | Y | Y | Y | Y | ...
3 | Y | Y | N | Y | Y | Y | ...
表格中的条目总数为U * U,对角线下方有U N&#39。
两种可能性取决于订单是否重要。交易(user_A,user_B)是否与交易(user_B,user_A)相同?如果订单重要,那么可能的交易数量是表格中{Y}的数量U * U - U
或(U-1) * U
。如果订单无关紧要,那么该数字(U-1) * U / 2
的一半是Triangular numbers。假设订单无关紧要。
现在,如果我们有两个用户,那么硬币的情况就差不多了。订单在这里很重要,因此用户之间可能进行C * (C-1)
次交易。
最后将两者相乘(U-1) * U * C * (C-1) / 2
。
好处是这是一个多项式U^2 * C^2
所以它不会快速增长。需要注意的是,如果你有指数增长,比如计算国际象棋中的动作。你很清楚这一点。
你问题中的一个可能性是U!这是将U个不同对象排列成序列的方法的数量。这将呈指数增长。
答案 1 :(得分:3)
有可能的用户,并且有可能的C币。 因此,存在OWNS = CxU可能的“个人拥有的硬币”。 因此,也有OWNS“可能的交易产品”。
但是,交易是一对两种这样的产品,受到两个人作为提供者不能相同的规则的限制,所提供的硬币也不能相同。因此,完成“可能提供”以形成“完整交易”的候选人数量为(C-1)x(U-1)。
因此,形成“全面交易”的可能有序对的数量是
CxUx(C-1)×(U-1)
然后,由于排列问题(交易是两个(人,币)对的 set ,而不是有序对),这仍然需要除以2。
但请注意,在“真正的”数据库设计世界中,这类问题实际上是一个非常愚蠢的问题!
答案 2 :(得分:1)
我需要知道,如果我获得1,000个用户,并且每个用户都有15个硬币,那么如果每个用户将每个硬币提供给另一个用户,那么将在该表中建立多少关系。
最可能发生的是,所有1,000名用户各自交易他们的所有15个硬币,进行7,500笔交易。这是15,000个交易硬币(1,000个用户x 15个硬币)。由于交易至少需要2个硬币,因此您将15,000除以2以获得最大交易数量,即7,500。
您的交易表基本上是用户数乘以硬币数量的Cartesian product除以2。
(U x C) / 2
我假设用户不是为了交易而进行交易。他们想要特定的硬币,一旦他们拿到硬币,就不会再次交易。
此外,大多数关系数据库可以处理表中的数百万甚至数十亿行。
请确保您在交易表中有交易ID和用户ID,交易ID的索引。
答案 3 :(得分:1)
我理解这一点的方式是您正在设计商品表。即用户 A 可以提供硬币 a 以换取硬币 b ,但不能提供给特定用户。任何其他用户都可以接受此优惠。如果是这种情况,最大报价数量与用户数 U 和硬币数量的平方 C 成正比。
可能交易的最大数量(忽视方向)是
C(C-1)/ 2
每个用户都可以提供所有可能的交易,只要每个用户都提供相同方向的交易,而不进行任何交易。因此,商品表中的绝对最大记录数为
C(C-1)/ 2 * U
如果允许两个以上用户之间的交易,则该数字会减少一半以上。例如。如果 A 为 b 提供 a , B 为 c提供 b 和 C 为 a 提供 c 。然后交易可以通过 A 从 B 获得 b , B 获得 c的三角形完成来自 C 和 C 从 A 获取 a 。
然后可以通过将 C 硬币分成两组来计算表中的最大行数,并在第一组中提供任何硬币以换取第二组中的任何硬币。如果组具有相同的大小, C / 2 ,我们将获得最大组合数。组合的数量是
C / 2 * C / 2 = C ^ 2/4 。
每个用户都可以提供所有这些交易,而不会有任何可能的交易。所以最大行数是
C 1-4 2/4 * U
只是
的一半C(C-1)/ 2 * U = 2 *(C ^ 2/4 * U) - C / 2 * U 。