数据库中的缓冲区 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 扫描来读取任一组。为了更快地访问较小的组,这里有两个选项:
- 验证标志上的聚簇索引。
- 验证行和无效行的单独分区。
在这两种情况下,更改记录的验证标志都相对昂贵,因为它涉及在不同数据页上读取和写入记录。除非每秒进行数十次更改,否则这可能不是什么大问题。
我有一个问题!
我需要做一个大学项目,在这个项目中我将有一个这样的数据库 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 扫描来读取任一组。为了更快地访问较小的组,这里有两个选项:
- 验证标志上的聚簇索引。
- 验证行和无效行的单独分区。
在这两种情况下,更改记录的验证标志都相对昂贵,因为它涉及在不同数据页上读取和写入记录。除非每秒进行数十次更改,否则这可能不是什么大问题。