2015-11-08 125 views
2

我有问题!数据库中的缓冲表,好还是不好?

我需要做一个大学项目,在这个项目中,我将有一个数据库表是这样的:

enter image description here

此表将具有记录了很多!!!!!! 为了管理这个,我需要创建一个验证系统。

的是创建一个缓存表像这样的最好的(为什么):

enter image description here

还是我的表中添加一列这样的:

enter image description here

谢谢!

+0

“*很多记录!!!!!! *”是什么意思? –

回答

1

您的问题没有足够的信息提供真实的答案。以下是关于如何思考这种情况的一些指导。哪种方法取决于应用程序的性质,尤其取决于“验证”的含义。

一个合理的解释是“验证”是工作流程的一部分,所以它只发生一次(或99%的时间只发生一次)。而且,当你看广告时,你从不想看到未验证的广告。如果是这种情况,那么通常会有关于验证过程的附加信息。

这种情况预示了两种合理的方法:

  • 做一个事务中进行验证。如果验证过程完全在数据库中并且以秒为单位进行测量,这将是合理的。
  • 为正在验证的广告设置单独的表格。也许甚至每个“用户”或“实体”负责它们的单独的表。根据验证过程的性质,这可能是一个将它们提供给进行验证的人员的队列。

把它们放在“advertisements”表中是没有意义的,因为验证过程中可能会包含额外的信息 - 谁,什么,何处,何时,如何。

如果广告可以多次验证和失效,那么最好的方法可能是将它们放在同一张表中。再次,有关于这个过程的性质的问题。

在没有全表扫描的情况下访问这两个组是非常棘手的。如果10%的行被无效并且90%被验证,则正常索引将需要全表扫描来读取任一组。要更快地访问较小的组,可以使用以下两种方法:

  • 验证标志上的聚簇索引。
  • 验证和无效行的单独分区。

在这两种情况下,更改记录的验证标志都相对昂贵,因为它涉及在不同数据页面上读写记录。除非每秒做出几十次更改,否则这可能不是什么大问题。

+0

而不是分区他可以创建一个有效的索引作为领先的列以获得100%的扫描效率。分区在这里看起来像是一个核选项。没有任何常见的功能,如删除分区或不同的存储可能是非常有用的。 – usr

+1

+1这实际上是考虑事情的正确方法。 @usr是否实用可能取决于一些外部因素 - 如果验证实际上是要实施的真实工作流的一部分,那么没有理由不这样做。这就是我所做的暗示在我的答案中,它可能会使编码更加复杂 - 但是如果您需要应用程序代码中的工作流程,那么情况就是这样。 – zxq9

+0

是的,如果工作流需要它,那肯定是一个加号,但它不会强制这个问题。为工作流程的所有状态提供单个表格可能非常方便。毕竟,“项目”是否被“验证”不会改变项目的身份。这只是一个不同的状态。例如:如果一个订单可以处于10个状态,则不会打开10个表。 – usr

1

这里,不需要有单独的“缓冲表”。你可以正确地索引valid字段。因此,以下索引基本上会自动创建一个缓冲表:

create unique index x on y (id) 
    include (all columns) 
    where (valid = 0) 

此索引创建尚未生效的数据的副本。你可以做很多变化,如

create unique index x on y (valid, id) 

真的不需要一个单独的表。与分区或者手动分区相比,索引非常简单。更少的工作,更普遍,更灵活和更少的潜在人为错误。

+0

这是否合理完全取决于所使用的数据库 - 并非所有数据库系统都像其他数据库一样顺畅地处理索引,特别是在复杂查询中,智能不足的查询计划员可能会丢弃索引并对整个表执行顺序扫描,要么是因为混乱的中间排序,要么是由于调整成本估算不佳。 – zxq9

+0

是的。没有考虑它,我认为是SQL Server。但这种情况非常简单,所以我不确定会出现什么问题。你的例子原则上是有效的,但我觉得它们不太可能。索引一个单一的,显然选择性的列似乎是最简单的事情。 – usr

0

这两种方法都是有效的,哪种方法性能更好取决于您使用的数据库的类型,而不是理论上使用布尔值还是将其分成两个表格的理论问题。

我其实更喜欢分区方法(你的缓冲表的想法),但是附近编码会更复杂。这可能是一个重要的考虑点。 大多数现代数据库将很好地处理索引的布尔标准,但有时您可能会感到惊讶。

从发展的角度来看,目前最重要的事情是选择一个并运行它,而不是在决定“正确”时瘫痪项目。