我要存儲一個團隊的顏色,但可惜我使用SQLite不支持enums.I要存儲球隊的顏色是這樣的:枚舉替代
id | team name | team colors
1 vikings red,orange,white
2 angles gold,black
什麼是要走的路?
我要存儲一個團隊的顏色,但可惜我使用SQLite不支持enums.I要存儲球隊的顏色是這樣的:枚舉替代
id | team name | team colors
1 vikings red,orange,white
2 angles gold,black
什麼是要走的路?
最簡單的方法(不一定是所有情況下最好的)是創建一個名爲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
有有很多需要用到的語法細節(並且有些情況下這可能是不可取的,但在一篇文章中討論太多)。但是,這是一般的想法,或多或少。
一個枚舉本質上是一個int,爲什麼不存儲int值呢?
我不想以這種方式存儲。 – Gandalf 2011-04-19 11:00:32
Buurman,仍然存在如何在sqllite中構建數據庫表的問題。所以比從一種形式到另一種形式鑄造價值更爲複雜。 – 2011-04-19 11:12:55
枚舉可以轉換爲整數。假設你有
enum Color { red = 1, orange = 2, white = 4, gold = 8, black = 0x10 };
Color teamColor = red | orange | white;
然後你可以存儲teamColor整數
(int)teamColor
。
這個信息在什麼類型的SQL結構存儲和檢索下仍然沒有回答。因爲這似乎是關係數據,所以我認爲這些信息不應該用枚舉來表示 - 因爲數據存儲的變化涉及到代碼的變化,反之亦然。數據及其定義僅駐留在數據庫或代碼中的一個位置。不在兩者上。 – 2011-04-19 13:00:02
也許有點矯枉過正,但是這樣的結構怎麼樣?
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會產生你需要的顏色列表。
另一方面,您可以只存儲顏色名稱。你必須在你的應用程序中解析它們。
幾乎我所建議的(+1)。我更喜歡使用C++原生文物。代碼和數據的rdbms。其他任何事情都是將數據硬編碼到代碼IMO中。 – 2011-04-19 11:11:52
我想到一個逗號分隔列表和JSON,但CDL的方式似乎更容易。 – Gandalf 2011-04-19 15:15:18
處理顏色的一種更好的方法是僅對錶格中的rgb值進行編碼,並在需要繪製時使用這些值(假設您需要繪製顏色)。 – 2011-04-19 15:45:23