数据库中的标志 – 明智的跟踪方式

我试图devise我的第一个数据库,我发现我有很多不同的“标志”,我想保留在数据库中:

Active # Shows whether the item submission has been completed Indexed # Shows whether the item has been indexed Reminded # Shows whether the “expiring email” has been sent to the user Error # Shows whether there is an error with the submission Confirmation # Shows whether the confirmation email has been sent 

除了有一个布尔字段这些,是否有一个聪明的方式来存储这些细节? 我想知道是否我在数据库中的状态组下面有这些内容,每个内涵都有一个ID(32),并链接到这个ID。

任何想法或意见将不胜感激:)

除非有其他原因,否则我建议简单地将这五个布尔(或位)列添加到项目表中。

这取决于内涵列表是多么不可变的。

如果只有你提到的五个,那么只需添加五个标志列。 如果将来可能的内涵列表可能会发生变化,那么使用一个单独的表格和一个一对多关系可能会更安全一些,这些表格具有当前适用于主表格中每行的内涵列表。

考虑:

 Table: Vehicle ID Type Doors Color Table: Type_Categories ID Name Table: Types TypeID CategoryID Value DataType 

这种方式可以根据需要在其他地方重复使用。 然而,如果所有的标志都是真正的布尔值,那么这个假设就是非布尔型的“标志”(Flags)… Id将它们放在表格中。 但我总是讨厌布尔值。 我更喜欢时间戳,所以我知道什么时候国旗的设置不仅仅是设置的。 如果时间戳为空,那么它没有被设置。

根据我的经验,状态栏经常演变为两个以上的状态。 所以我会使用一个smallint为每个状态方便和简单。

但是,如果您的目标是节省空间,那么您可以将所有状态保存在一个smallint通过使用强制转换来单独或作为整体来操作状态。

 create table t (status smallint); 

要保存10010然后将其转换为smallint:

 insert into t (status) values (b'10010'::int::smallint); 

列出所有状态:

 select status::int::bit(5) from t; status -------- 10010 

要设置第三个状态,请使用bitwise or

 update t set status = (status::integer::bit(5) | b'00100')::integer::smallint; select status::int::bit(5) from t; status -------- 10110 

要取消设置状态,请使用bitwise and

 update t set status = (status::integer::bit(5) & b'11011')::integer::smallint; select status::int::bit(5) from t; status -------- 10010 

要检索第三个状态集的行,请执行以下操作:

 select status from t where substring(status::integer::bit(5) from 3 for 1) = '1' 

你可以编写函数来简化转换。

如果它们是“只”标志,则将它们作为布尔型列存储在表上。

我建议不要Clodoaldo的解决方案,除非空间非常紧 – 看到这个问题。

它看起来像你提到的列具有“业务重要性” – 即它可能不足以存储“索引”,但也是项目被索引的日期。 可能有必要限制状态的组合,或对排序施加规则(在错误状态下不能完成)。 在这种情况下,您可能需要实现一个“item_status”表来存储历史记录等

在这种情况下,你的模式将是这样的:

 ITEM --------- item_id .... STATUS --------- status_id description ITEM_STATUS -------------- item_id status_id date 

每次项目更改状态时,都会在ITEM_STATUS表中插入一个新行; 当前状态是该项目的最新日期的行。