我要存储一个团队的颜色,但可惜我使用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