我正在尝试设计我的第一个数据库,我发现我想在数据库中保留相当多的“标志”:
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),只是链接到那个。
非常感谢任何想法或意见:)
答案 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表中插入一个新行;当前状态是具有该项目的最新日期的行。