在MySQL中存储用户操作数据:一个表还是多个表?

时间:2010-09-07 17:14:52

标签: mysql database-design join schema

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

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

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

最后,我正在优化速度而不是尺寸。我该如何应对这种困境?

1 个答案:

答案 0 :(得分:1)

通常,避免在大表中加入是速度的好习惯,但这实际上取决于您的使用情况。

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

如果您所做的只是单行索引提取(用户完成此特定操作),那么使用不同的表可能会更有效。您将能够查询特定的表,因为它更小,它可能更具响应性。

我看到的一个实践是使用通用字段(number1,number2,... string1,string2 ...)和一个根据操作类型描述每个字段的映射表。这种做法的好处是桌子的人口密度更高。缺点是理解表中的数据变得困难,并且保持映射同步是一项艰苦的工作。如果有充分的理由,我只会使用它。例如,您有超过50种不同的动作类型(在这种情况下,管理50个表也不是野餐)。