【发布时间】:2011-08-08 14:05:46
【问题描述】:
我想存储团队的颜色,但不幸的是我正在使用不支持枚举的 sqlite。我想像这样存储团队颜色:
id | team name | team colors
1 vikings red,orange,white
2 angles gold,black
怎么走?
【问题讨论】:
我想存储团队的颜色,但不幸的是我正在使用不支持枚举的 sqlite。我想像这样存储团队颜色:
id | team name | team colors
1 vikings red,orange,white
2 angles gold,black
怎么走?
【问题讨论】:
也许有点矫枉过正,但这样的结构怎么样?
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 将生成您需要的颜色列表。
另一方面,您可以按原样存储颜色名称。您必须在应用程序中解析它们。
【讨论】:
最简单的方法(不一定在所有条件下都是最好的)是创建一个名为colors 的表(例如):
table color
id | color
1 green
2 red
3 blue
....
那是你的枚举表。您的 c++ 枚举可以转换为整数,然后可以用作主键值。但是,如果您将此数据存储在关系存储中,我认为您不希望将这些数据与枚举等代码级工件联系起来。表内容的更改必须强制更改代码。
然后,以典型的标准化方式,您创建一个relational attribute 表,以表示您的团队和颜色枚举之间的多对多关系。 color_id 字段映射到颜色表的主键,team_id 映射到团队表的主键。
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
有很多语法细节需要处理(并且在某些情况下这可能是不可取的,在一篇文章中讨论太多了)。不过,这或多或少是大体上的想法。
【讨论】:
枚举可以转换为整数。说你有
enum Color { red = 1, orange = 2, white = 4, gold = 8, black = 0x10 };
Color teamColor = red | orange | white; 然后你可以将teamColor存储为整数(int)teamColor。
【讨论】:
枚举本质上是一个 int,那为什么不存储 int 值呢?
【讨论】: