【问题标题】:Storing user action data in MySQL: one table or many?在 MySQL 中存储用户操作数据:一张还是多张?
【发布时间】:2010-09-08 14:47:29
【问题描述】:

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

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

除了上述操作表之外,另一种选择是为每种操作类型添加一个表。每个动作类型表都有一个指向动作表中相关动作的外键。这将使操作表更好地组织,但它引入了操作表与操作类型表不同步的可能性。我还想知道,每当我从操作表中获取数据时,必须对不同的操作类型表执行大量连接对性能的影响。

最后,我优化的是速度而不是大小。我应该如何解决这个困境?

【问题讨论】:

    标签: mysql database-design join schema


    【解决方案1】:

    通常,避免在大型表中进行联接是提高速度的好习惯,但这实际上取决于您的使用情况。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 2017-09-01
      • 2011-04-30
      • 2014-01-31
      • 1970-01-01
      • 2011-03-14
      • 2012-11-28
      • 1970-01-01
      相关资源
      最近更新 更多