2011-12-21 90 views
4

我正在研究跟踪和处理工单/门票的应用程序。每张票都链接到通过级联MySQL中的任何更改的外键创建/拥有票的用户。显然,如果用户由于某种原因曾经删除他们的账户,我们仍然希望记录他们的门票和他们的基本信息。存储已删除用户数据的最佳方法?

实现这个想法的第一种方法是在用户表中有一列表示它们是处于活动状态还是非活动状态,即是否已删除。这样当他们关闭/删除他们的账户时,他们只是翻转这个值,然后无法访问应用程序。

我的另一个想法是当账户被删除时,将用户记录移到已删除的用户表中。通过这种方式可以将用户表的性能保持在最佳状态,这在增大时可能是一笔巨大的交易,但会增加额外的查询来移动记录。

显然这部分可以是首选项,但我对性能方面感兴趣。本质上,问题是选择查询与插入查询相比如何,以及在什么时候通过将插入查询(将记录移动到已删除的用户表)添加到混合中来提高总体性能?

回答

10

在users表中有一列表示它们是处于活动状态还是非活动状态,即是否已删除。

好。

其他想法,我已经到了用户记录移动到已删除用户表

坏。您现在有两个连接:用户到票证和前用户到票证。这是一个不必要的复杂性。

可能是一个巨大的交易,当它变大,

如果由“大”,你的意思是数百万的用户,那么你是对的。 但是,如果“大”,你意味着成千上万的用户,你将无法测量太多的差异。

而且。如果您未来确实会有明显的减速,您可以使用诸如“物化视图”之类的内容来自动创建“活动”用户的子集视图/表格。

这可能是偏好的明显部分,

不是真的。取消激活(但不删除)用户具有许多优点并且没有真正的缺点。

有很多级别的活动 - 安全锁定(但未禁用) - 暂时禁用 - 委托给其他用户。很多很多的状态变化。几乎没有删除的理由。没有理由“转移到另一张桌子”。

选择查询如何与插入查询进行比较,以及在什么时候通过向插入查询添加插入查询(将记录移动到删除的用户表)来增加整体性能?

只有你可以为你的表,你的索引,你的服务器和你的交易组合进行测量。没有通用的答案。

+0

我的意思是数百万当我说大。我对“物化视图”并不了解,因为(我确信这很明显),我不是一个真正的数据库人员。但是,这听起来像是我应该研究的东西。 我知道每个查询都需要最少量的资源和时间作为基准,并且我认为使用它可以计算何时添加额外的查询会对整体有利。 无论如何,很好的答案,谢谢。 – 2011-12-21 18:36:47

+0

“你可以计算何时添加额外的查询会对整体有利”。你无法计算它。由于数据库设计和实现的各种自由度,这几乎是不可能的。您只能对您的设计和实施选择进行实证研究。 – 2011-12-21 18:48:50

+0

* is_deleted *列的一个令人讨厌的缺点是你不能完全使用UNIQUE键,除非你把NULL放在它里面而不是TRUE。 – 2015-12-11 14:08:28

1

在我看来,标记用户为删除或不是更好的方法。第二种方法,使用新表格,会引起用户引用用户表格的每个表格发生更改。您应该为“已删除的用户表”添加新的外键。这将更改此表中所有选择行的查询。

正如您所写,该应用程序是关于门票的,逻辑上大多数查询将关于选择和编辑门票。所以影响会在这张桌子上,我不认为你对用户有很大的疑问。

对“用户”表进行优化并对“票据”表进行更复杂的查询不会得到回报。

相关问题