一尘不染

是否激活标志?

sql

好的,因此实际上每个基于数据库的应用程序都必须处理“非活动”记录。软删除或将某些内容标记为“要忽略”。我对“活动”列(或状态列)上是否有任何激进的替代想法感到好奇。

例如,如果我有一个人名单

CREATE TABLE people (
  id       INTEGER PRIMARY KEY,
  name     VARCHAR(100),
  active   BOOLEAN,
  ...
);

这意味着要获得活跃人群的列表,您需要使用

SELECT * FROM people WHERE active=True;

有谁建议将非活动记录移到单独的表中,并在适当的位置将UNION合并为两个表?

好奇心惊人…

编辑: 我应该明确地说,我是从纯粹主义者的角度出发的。我可以看到对于大量数据可能需要进行数据归档,但这不是我要从哪里来的。如果您执行SELECT * FROM people,那么对我来说,这些条目在某种意义上是“活动的”

谢谢


阅读 118

收藏
2021-03-17

共1个答案

一尘不染

您在活动标志上对表进行分区,以使活动记录位于一个分区中,而非活动记录位于另一分区中。然后,为每个自动创建活动过滤器的表创建一个活动视图。数据库查询引擎自动将查询限制在其中具有活动记录的分区,这比在该标志上使用索引要快得多。

这是如何在Oracle中创建分区表的示例。Oracle没有布尔列类型,因此出于Oracle的目的,我修改了您的表结构。

CREATE TABLE people
(
   id       NUMBER(10),
   name     VARCHAR2(100),
   active   NUMBER(1)
)
PARTITION BY LIST(active)
(
   PARTITION active_records VALUES (0)
   PARTITION inactive_records VALUES (1)
);

如果需要,可以将每个分区放在不同的表空间中。您还可以对索引进行分区。

顺便说一句,这似乎是这个问题的重复,作为一个新手,我需要问一下,处理意外重复的过程是什么?

编辑: 根据注释中的要求,提供了一个在Oracle中创建分区表的示例

2021-03-17