2013-01-31 368 views
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)並且只是鏈接到該組。

任何意見或輸入將不勝感激:)

回答

2

除非有一些理由不這樣做,我建議乾脆將那五個布爾(或位),列於項目表。

0

這取決於內涵列表是如何不可變的。

如果只有你提到的五個,那麼只需添加五個標誌列。如果將來可能的內涵列表可能會發生變化,那麼將單獨的表格與當前應用於主表格中每行的內涵列表結合起來可能更安全一對多關係。

0

考慮:根據需要

Table: Vehicle 
ID 
Type 
Doors 
Color 

Table: Type_Categories 
ID 
Name 

Table: Types 
TypeID 
CategoryID 
Value 
DataType 

這樣的重複使用類型的可以在其他地方發生。然而,如果所有的標誌都是真正的布爾值,那麼這個假設就是非布爾型的「標誌」... Id將它們放在表格中。但我總是討厭布爾值。我更喜歡時間戳,所以我知道國旗的設置不僅僅是設置了它。如果時間戳記爲空,那麼它沒有被設置。

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 

爲了與第三狀態設置檢索行:

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

您可以編寫函數來簡化轉換。

0

如果它們是「正好」標誌,則將它們作爲布爾型列存儲在表上。

我建議不要使用Clodoaldo的解決方案,除非空間非常緊 - 請參閱this問題。

它看起來像你提到的列具有「業務重要性」 - 即它可能不足以存儲「索引」,但也可能是項目被索引的日期。可能有必要限制狀態的組合,或對排序施加規則(在錯誤狀態下不能完成)。在這種情況下,你可能要實現一個「ITEM_STATUS」表來存儲歷史等

在這種情況下,你的模式將是這樣的:

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

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

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

每當一個項目改變現狀,你在ITEM_STATUS表中插入新行;當前狀態是具有該項目最新日期的行。

+0

你能解釋一下這個嗎?我有一個ID爲item_status的表格,它鏈接到主要的「項目」,項目狀態會記錄「索引」字段以顯示它何時完成? – Jimmy

+0

我已經包含了一個示例模式 –