我们不再将枚举存储为数字序数值;它使调试和支持方式太困难了。我们存储转换为字符串的实际枚举值:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
然后读回:
Suit theSuit = Suit.valueOf(reader["Suit"]);
问题在于过去盯着企业管理器并试图破译:
Name Suit
------------ ----
Kylie Guénin 2
Ian Boyd 1
诗句
Name Suit
------------ -------
Kylie Guénin Diamond
Ian Boyd Heart
后者要容易得多。前者需要获取源代码并查找分配给枚举成员的数值。
是的,它需要更多的空间,但是枚举成员名称很短,硬盘驱动器很便宜,当您遇到问题时,帮助起来要值得得多。
此外,如果您使用数值,则会与它们相关联。如果不强制使用旧的数值,就无法很好地插入或重新排列成员。例如,将 Suit 枚举更改为:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
必须成为:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
以维护存储在数据库中的旧数值。
如何在数据库中对它们进行排序
问题来了:假设我想对值进行排序。有些人可能希望按 序数值对它们进行排序。当然,按枚举的数值对卡片进行排序是没有意义的:enum
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
这不是我们想要的顺序 - 我们希望它们按枚举顺序排列:
SELECT Suit FROM Cards
ORDER BY CASE SuitID OF
WHEN 4 THEN 0 --Unknown first
WHEN 1 THEN 1 --Heart
WHEN 3 THEN 2 --Club
WHEN 2 THEN 3 --Diamond
WHEN 0 THEN 4 --Spade
ELSE 999 END
如果保存字符串,则需要执行保存整数值时所需的相同工作:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
但这不是我们想要的顺序 - 我们希望它们按枚举顺序排列:
SELECT Suit FROM Cards
ORDER BY CASE Suit OF
WHEN 'Unknown' THEN 0
WHEN 'Heart' THEN 1
WHEN 'Club' THEN 2
WHEN 'Diamond' THEN 3
WHEN 'Space' THEN 4
ELSE 999 END
我的观点是,这种排名属于用户界面。如果根据项目的枚举值对项目进行排序:则表示您做错了什么。
但是如果你想真正做到这一点,我会创建一个维度表:Suits
适合 |
西装标识 |
排 |
颜色 |
未知 |
4 |
0 |
零 |
心 |
1 |
1 |
红 |
俱乐部 |
3 |
2 |
黑 |
钻石 |
2 |
3 |
红 |
铁锹 |
0 |
4 |
黑 |
这样,当您想要更改卡牌以使用接吻王新套牌时,您可以将其更改为显示目的,而不会丢弃所有数据:
适合 |
西装标识 |
排 |
颜色 |
卡片订购 |
未知 |
4 |
0 |
零 |
零 |
铁锹 |
0 |
1 |
黑 |
1 |
钻石 |
2 |
2 |
红 |
1 |
俱乐部 |
3 |
3 |
黑 |
-1 |
心 |
1 |
4 |
红 |
-1 |
现在,我们将内部编程详细信息(枚举名称,枚举值)与用于用户的显示设置分开:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder