2010-09-07 23 views
3

我正在构建一个网站,其中用户可以执行各种操作,并且他们可以获得可变数量的“点数”或“徽章”以执行特定操作。无论用户执行哪种类型的操作(例如用户ID,操作类型,时间戳,当前点总数以及授予的任何徽章),都必须存储某些数据。但取决于用户执行的操作类型,必须存储一些特定于操作类型的数据,包括BLOB中的图像数据。在MySQL中存储用户操作数据:一个表还是多个表?

一个选项是包含动作表中所有动作类型的所有字段。不幸的是,这些列中的每一列只会存储与适当操作类型匹配的小部分操作的数据。所以我会用这种方法有大量的空字段(包括BLOB)。

另一种选择是除上述动作表之外,还包括每个动作类型的表格。每个动作类型表都有一个外键给动作表中的相关动作。这将使动作表更好地组织,但它引入动作表与动作类型表不同步的可能性。我还想知道,无论何时从动作表中获取数据,都必须在不同的动作类型表上进行大量连接,从而影响性能。

最后,我对速度而不是尺寸进行了优化。我应该如何解决这个困境?

回答

1

通常,避免在大表中加入是一种很好的速度练习,但这取决于你的使用。

如果您计划在动作表上执行聚合,我强烈建议使用单表方法。

如果你所做的只是单行索引提取(用户完成了这个特定的操作),那么也许使用不同的表将会更有效率。您将能够查询特定的表格,并且由于它更小,因此可能更具响应性。

我看到很多的做法是使用通用字段(number1,number2,... string1,string2 ...)以及根据动作类型描述每个字段的映射表。这种做法的好处是表格更人口稠密。缺点是理解表中的数据变得困难并且保持映射同步是困难的。如果有充分的理由,我只会使用它。例如,你有超过五十种不同的动作类型(在这种情况下,管理五十张桌子也不是野餐)。

相关问题