【问题标题】:MySql table structureMySql表结构
【发布时间】:2010-08-06 12:10:04
【问题描述】:

目前,我在 mysql 中有一个记录事务的表。这些交易可能会被用户更新——有时从不,有时经常。但是,我需要跟踪此表中每个字段的更改。所以,我现在拥有的是表中名为“is_deleted”的 TINYINT(1) 字段,当用户“更新”事务时,它只是将旧记录的 is_deleted 字段更新为 1 并插入一个全新的记录。

这一切都很好,因为我只需要运行以下 sql 语句来获取所有当前记录:

SELECT id, foo, bar, something FROM trans WHERE is_deleted = 0;

但是,我担心这个表会随着时间的推移变得不必要的大,因此我正在考虑实际删除旧记录并将其“归档”到另一个表 (trans_deleted)。这意味着 trans 表将只包含“实时”记录,因此使 SELECT 查询更快一点。

不过,这确实意味着更新记录的时间会稍长一些,因为它将运行 3 个查询: 1. INSERT INTO trans_deleted 旧记录; 2. DELETE from trans WHERE id = 5; 3. INSERT INTO trans 新记录

因此,更新记录需要更多的工作,但读取会更快。

对此有什么想法吗?

【问题讨论】:

标签: mysql database-design


【解决方案1】:

我会建议一个表 trans 和一个 table_revision

trans 有字段 idcurrent_revision 并且 revision 有字段 id em>、transidfoobar

然后获取所有当前项目:

SELECT r.foo, r.bar FROM trans AS t
  LEFT JOIN revision AS r ON t.id = r.trans_id
  WHERE t.current_revision = r.id

如果您现在将索引放在 r.id 和 r.trans_id 上,归档不会让您更快。

【讨论】:

    【解决方案2】:

    通常情况下,您阅读的次数远多于编写的次数(并且您还说某些记录可能永远不会更改)。所以这是使用存档表的原因之一。

    还有另一个问题:您还必须考虑程序员的时间,而不仅仅是处理器时间 :) 如果您将存档的行与活动的行保存在同一个表中,您必须记住并注意这一点您对该表执行的每个查询。更不用说可能不得不处理表格的未来程序员......我会推荐仅基于这个因素的归档方法,即使没有任何速度提升!

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2012-12-30
      • 2013-08-22
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多