【发布时间】:2015-11-08 12:51:19
【问题描述】:
我有一个问题!
我需要做一个大学项目,在这个项目中我将有一个这样的数据库表:
这个表会有很多记录!!!!!! 为了管理这一点,我需要创建一个验证系统。
在创建这样的缓冲表之间最好(以及为什么):
或者像这样在我的表中添加一列:
谢谢!
【问题讨论】:
-
“a LOT of records !!!!!!”是多少行?
标签: sql database database-schema
我有一个问题!
我需要做一个大学项目,在这个项目中我将有一个这样的数据库表:
这个表会有很多记录!!!!!! 为了管理这一点,我需要创建一个验证系统。
在创建这样的缓冲表之间最好(以及为什么):
或者像这样在我的表中添加一列:
谢谢!
【问题讨论】:
标签: sql database database-schema
您的问题没有足够的信息来提供真正的答案。这里有一些关于如何思考这种情况的指导。哪种方法取决于您的应用程序的性质,尤其是“验证”的含义。
一种合理的解释是“验证”是工作流程的一部分,因此它只发生一次(或 99% 的时间只发生一次)。而且,当您查看广告时,您永远不想看到未经验证的广告。如果是这种情况,那么通常会有关于验证过程的其他信息。
这种情况提出了两种合理的方法:
将它们放在“广告”表中没有意义,因为验证过程中可能涉及其他信息——谁、什么、在哪里、何时、如何。
如果一个广告可以多次验证和无效,那么最好的方法可能是将它们放在同一个表中。再一次,对过程的性质存在疑问。
在没有全表扫描的情况下访问这两个组是很棘手的。如果 10% 的行无效且 90% 的行已验证,则正常索引将需要全表扫描来读取任一组。为了更快地访问较小的组,这里有两个选项:
在这两种情况下,更改记录的验证标志相对昂贵,因为它涉及在不同数据页上读取和写入记录。除非每秒进行数十次更改,否则这可能没什么大不了的。
【讨论】:
在这里,不需要单独的“缓冲表”。您可以正确索引 valid 字段。所以下面的索引本质上会自动创建一个缓冲表:
create unique index x on y (id)
include (all columns)
where (valid = 0)
此索引会创建无效数据的副本。你可以做很多变化,比如
create unique index x on y (valid, id)
真的不需要单独的表。与分区甚至手动分区相比,索引非常容易。更少的工作,更通用,更灵活,更少的人为错误。
【讨论】:
任何一种方法都是有效的,哪种方法性能更好将更多地取决于您使用的数据库类型,而不是使用布尔值或将其划分为两个表是否更正确的理论问题。
我实际上更喜欢分区方法(您的缓冲表想法),但是编码会更复杂。这可能是需要考虑的重要一点。 大多数现代数据库都可以通过索引很好地处理布尔标准,但有时您可能会感到惊讶。
从开发的角度来看,现在最重要的事情是选择一个并运行它,而不是在您决定“正确”的一个时使您的项目瘫痪。
【讨论】: