3

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

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

4

5 回答 5

2

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

于 2013-01-31T14:18:40.440 回答
0

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

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

于 2013-01-31T14:21:48.233 回答
0

考虑:

Table: Vehicle
ID
Type
Doors
Color

Table: Type_Categories
ID
Name

Table: Types
TypeID
CategoryID
Value
DataType

这样可以根据需要在其他地方重用类型。但是,如果所有标志都是真正的布尔值,则假定非布尔值“标志”...... Id 坚持 w/ 将它们放在表中。但我一直讨厌布尔值。我更喜欢时间戳,所以我知道标志是什么时候设置的,而不仅仅是它被设置了。如果时间戳为空,则未设置。

于 2013-01-31T14:23:58.367 回答
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

要设置第三种状态,请使用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'

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

于 2013-01-31T15:36:45.010 回答
0

如果它们是“只是”标志,请将它们作为布尔类型的列存储在表中。

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

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

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

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

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

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

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

于 2013-01-31T15:55:57.723 回答