需要一个解决方案来设计我的数据库,它有一些潜在的排列复杂性?

时间:2014-03-25 09:59:36

标签: math database-design

我正在建立一个网站,我需要确保"硬币的数量"和#34;用户"如果增长太快,不会杀死数据库。我首先在mathematica上发布了这个(认为它是一个数学网站,但发现它不是)。如果这是错误的地方,请告诉我,我会相应地移动它。但是,它可以归结为解决一个复杂的问题:如果用户增长得太快,我的数据库是否会爆炸?

问题在于:

我试图确认以下方程式是否适用于我的问题。问题是我有USERS(u),我有硬币(c)。

  • 有数百万种不同的硬币。
  • 一个用户可能拥有另一个用户拥有的相同硬币。 (即两个用户都有硬币A)
  • 用户可以互相交换硬币。 (即硬币B的交易硬币A)
  • 每个用户都可以用另一枚硬币交换任何硬币,只要:
    • 他们不会用相同的硬币交易硬币(即不能用硬币A换取另一枚硬币A)
    • 他们不能与自己交易(即我不能为自己的硬币B提供自己的硬币A)

因此,实际上,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个用户,那么这个桌子不会爆炸成数百万个记录?

4 个答案:

答案 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