数据库中的标志 - 保持跟踪的明智方式

时间:2013-01-31 14:15:28

标签: sql database linux postgresql debian

我正在尝试设计我的第一个数据库,我发现我想在数据库中保留相当多的“标志”:

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),只是链接到那个。

非常感谢任何想法或意见:)

5 个答案:

答案 0 :(得分:2)

除非有其他理由不这样做,否则我建议您只需将这五个布尔(或位)列添加到项目表中。

答案 1 :(得分:0)

这取决于内涵列表的不可变性。

如果只有你提到的五个,那么只需添加五个标志列。如果将来可能的内容列表发生变化,那么拥有一个单独的表可能更安全,该表包含当前应用于主表中每一行的内涵列表,并具有一对多的关系。

答案 2 :(得分:0)

考虑:

Table: Vehicle
ID
Type
Doors
Color

Table: Type_Categories
ID
Name

Table: Types
TypeID
CategoryID
Value
DataType

这样,类型的重用可以根据需要在其他地方进行。然而,如果所有标志都是真正的布尔值,则假定非布尔“标志”... Id将w /放在表中。但我总是讨厌布尔值。我更喜欢时间戳,所以我知道标志设置的时间不仅仅是设置的。如果时间戳为空,则表示尚未设置。

答案 3 :(得分:0)

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

但是,如果您的目标是节省空间,那么您可以使用强制转换将smallint中的所有状态保存到bit,以单独或整体操作状态。

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

要设置第3个状态,请使用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

要检索设置了第3个状态的行:

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

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

答案 4 :(得分:0)

如果它们是“just”标志,则将它们存储为表格中的布尔类型列。

除非空间非常紧,否则我建议不要使用Clodoaldo的解决方案 - 请参阅this问题。

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

在这种情况下,您的架构将是这样的:

ITEM
---------
item_id
....

STATUS
---------
status_id
description

ITEM_STATUS
--------------
item_id
status_id
date

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