2011-04-19 78 views
1

我要存儲一個團隊的顏色,但可惜我使用SQLite不支持enums.I要存儲球隊的顏色是這樣的:枚舉替代

id | team name | team colors 

1  vikings   red,orange,white 

2  angles   gold,black 

什麼是要走的路?

回答

3

最簡單的方法(不一定是所有情況下最好的)是創建一個名爲colors(例如)表:

table color 
id | color 
1 green 
2 red 
3 blue 
.... 

這就是你的枚舉表。您的C++枚舉可以被轉換爲整數,然後可以將其用作主鍵值。但是,如果您將這些數據存儲在關係存儲中,我認爲您不希望將這些數據與枚舉等代碼級工件綁定在一起。表格內容的變化必須強制更改代碼。

然後,以典型的標準化方式創建relational attribute表,以表示您的團隊與顏色枚舉之間的多對多關係。 color_id字段映射到顏色的表主鍵,並且team_id映射到teams表主鍵。

table team-colors (color_id + team_id == primary key) 
color_id | team_id 
1   1 
2   1 
2   2 
3   2 
.... 

然後你有你的團隊的表

table teams 
id | name 
1  vikings 
2  angles 
.... 

知道每隊的顏色,有一個觀點(或運行SQL)用下面的SQL僞

SELECT a.id as team_id, a.name, b.color, b.id as color_id 
FROM teams a, colors b, team_colors c 
WHERE a.id = c.team_id and b.id = team_colors.color_id 

有有很多需要用到的語法細節(並且有些情況下這可能是不可取的,但在一篇文章中討論太多)。但是,這是一般的想法,或多或少。

+0

我想到一個逗號分隔列表和JSON,但CDL的方式似乎更容易。 – Gandalf 2011-04-19 15:15:18

+0

處理顏色的一種更好的方法是僅對錶格中的rgb值進行編碼,並在需要繪製時使用這些值(假設您需要繪製顏色)。 – 2011-04-19 15:45:23

0

一個枚舉本質上是一個int,爲什麼不存儲int值呢?

+1

我不想以這種方式存儲。 – Gandalf 2011-04-19 11:00:32

+1

Buurman,仍然存在如何在sqllite中構建數據庫表的問題。所以比從一種形式到另一種形式鑄造價值更爲複雜。 – 2011-04-19 11:12:55

2

枚舉可以轉換爲整數。假設你有

enum Color { red = 1, orange = 2, white = 4, gold = 8, black = 0x10 }; 
Color teamColor = red | orange | white;
然後你可以存儲teamColor整數 (int)teamColor

+0

這個信息在什麼類型的SQL結構存儲和檢索下仍然沒有回答。因爲這似乎是關係數據,所以我認爲這些信息不應該用枚舉來表示 - 因爲數據存儲的變化涉及到代碼的變化,反之亦然。數據及其定義僅駐留在數據庫或代碼中的一個位置。不在兩者上。 – 2011-04-19 13:00:02

4

也許有點矯枉過正,但是這樣的結構怎麼樣?

COLORS 
id color 
1 red 
2 orange 
3 white 
4 gold 
5 black 

TEAMS 
id | team name | team colors 
1 vikings  1 
2 angles  2 

TEAM COLORS 
teamid | colorid 
1  1 
1  2 
1  3 
2  4 
2  5 

一些簡單的sql會產生你需要的顏色列表。

另一方面,您可以只存儲顏色名稱。你必須在你的應用程序中解析它們。

+0

幾乎我所建議的(+1)。我更喜歡使用C++原生文物。代碼和數據的rdbms。其他任何事情都是將數據硬編碼到代碼IMO中。 – 2011-04-19 11:11:52