【问题标题】:enums alternatives枚举替代品
【发布时间】:2011-08-08 14:05:46
【问题描述】:

我想存储团队的颜色,但不幸的是我正在使用不支持枚举的 sqlite。我想像这样存储团队颜色:

id   |   team name   |  team colors

1      vikings           red,orange,white

2      angles            gold,black

怎么走?

【问题讨论】:

    标签: c++ qt4 sqlite


    【解决方案1】:

    也许有点矫枉过正,但这样的结构怎么样?

    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 代码中。
    【解决方案2】:

    最简单的方法(不一定在所有条件下都是最好的)是创建一个名为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
    

    有很多语法细节需要处理(并且在某些情况下这可能是不可取的,在一篇文章中讨论太多了)。不过,这或多或少是大体上的想法。

    【讨论】:

    • 我在考虑逗号分隔列表和 JSON,但 CDL 方式似乎更容易。
    • 处理颜色的更好方法是仅对表格中的 rgb 值进行编码,并在需要绘制时使用这些值(假设您需要绘制颜色)。
    【解决方案3】:

    枚举可以转换为整数。说你有

    enum Color { red = 1, orange = 2, white = 4, gold = 8, black = 0x10 };
    Color teamColor = red | orange | white;
    然后你可以将teamColor存储为整数(int)teamColor

    【讨论】:

    • 这仍然没有回答在什么类型的 SQL 结构下存储和检索该信息。由于这似乎是关系数据,我认为不应将这些信息表示为枚举 - 因为数据存储的更改涉及代码的更改,反之亦然。数据及其定义仅位于一个位置,在数据库或代码中。两者都没有。
    【解决方案4】:

    枚举本质上是一个 int,那为什么不存储 int 值呢?

    【讨论】:

    • 我不想那样存储。
    • Buurman,还有一个问题是如何在 sqllite 中构造数据库表。因此,它比将值从一种形式转换为另一种形式更复杂。
    猜你喜欢
    • 2013-08-01
    • 1970-01-01
    • 2014-08-22
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多