MySql表结构

时间:2010-08-06 12:10:04

标签: mysql database-design

目前,我在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.插入trans_deleted旧记录; 2.从trans WHERE id = 5删除; 3.插入转换新记录

因此,更新记录需要更多工作,但阅读速度会更快。

对此有何想法?

2 个答案:

答案 0 :(得分:1)

我建议使用表 trans table_revision

trans 的字段 id current_revision revision 的字段 id transid foo bar

然后获取所有当前项目:

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归档将不会让您更快。

答案 1 :(得分:0)

通常情况下,你阅读的次数比你写的要多得多(而且你还说一些记录可能永远不会改变)。这就是去存档表的一个原因。

还有另外一个:你还需要考虑程序员时间,而不仅仅是处理器时间:)如果你将存档的行与实时行保持在同一个表中,你必须记住并处理它您在该表上执行的每个查询。不要说未来的程序员可能不得不处理这个问题...我建议仅基于这个因素的归档方法,即使没有任何速度提升!