数据库中的缓冲区 table,好不好?

Buffer table in a database, Good or not?

我有一个问题!

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

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

像这样创建缓冲区 table 之间最好的(以及为什么)是什么:

或者像这样在我的 table 中添加一列:

谢谢!

这里,不需要单独的"buffer table"。您可以正确索引 valid 字段。所以下面的索引基本上会自动创建一个缓冲区 table:

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

该索引创建了一份无效数据的副本。你可以做很多变化,比如

create unique index x on y (valid, id)

确实没有必要单独 table。与分区甚至手动分区相比,索引非常容易。工作更少,更通用,更灵活,人为错误的可能性更小。

这两种方法都是有效的,哪种方法性能更好将更多地取决于您使用的数据库类型,而不是使用布尔值或将其分为两个更正确的理论问题tables.

我实际上更喜欢分区方法(您的缓冲区 table 想法),但是 围绕 编码会更复杂。这可能是一个需要考虑的重要问题。 大多数现代数据库都可以通过索引很好地处理布尔标准,但有时您会感到惊讶。

从发展的角度来看,现在最重要的事情是选择一个 运行,而不是在决定 "right" 个时让你的项目瘫痪。

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

一个合理的解释是 "validation" 是工作流程的一部分,因此它只发生一次(或 99% 的时间只发生一次)。而且,当您查看广告时,您永远不想看到未经验证的广告。如果是这种情况,那么通常会有关于验证过程的附加信息。

这种情况提出了两种合理的方法:

  • 在交易中进行验证。如果验证过程完全在数据库中并以秒为单位进行测量,这将是合理的。
  • 有一个单独的 table 用于验证广告。甚至可能每个 "user" 或 "entity" 都有一个单独的 table 负责它们。根据验证过程的性质,这可能是一个队列,将它们提供给进行验证的人。

将它们放在 "advertisements" table 中没有意义,因为验证过程可能涉及其他信息——谁、什么、哪里、何时、如何。

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

在没有完整 table 扫描的情况下访问这两个组是很棘手的。如果 10% 的行无效,90% 的行有效,那么普通索引将需要完整的 table 扫描来读取任一组。为了更快地访问较小的组,这里有两个选项:

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

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