2011-04-19 91 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