Wir speichern Aufzählungen nie mehr als numerische Ordnungswerte. es macht das Debuggen und die Unterstützung viel zu schwierig. Wir speichern den tatsächlichen Aufzählungswert, der in eine Zeichenfolge konvertiert wurde:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
und dann zurücklesen mit:
Suit theSuit = Suit.valueOf(reader["Suit"]);
Das Problem bestand in der Vergangenheit darin, Enterprise Manager anzustarren und zu entschlüsseln:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
Verse
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
Letzteres ist viel einfacher. Ersteres erforderte das Aufrufen des Quellcodes und das Finden der numerischen Werte, die den Aufzählungselementen zugewiesen wurden.
Ja, es nimmt mehr Platz in Anspruch, aber die Namen der Aufzählungsmitglieder sind kurz und die Festplatten sind billig, und es lohnt sich viel mehr, bei Problemen zu helfen.
Wenn Sie numerische Werte verwenden, sind Sie außerdem an diese gebunden. Sie können die Elemente nicht gut einfügen oder neu anordnen, ohne die alten Zahlenwerte erzwingen zu müssen. Ändern Sie beispielsweise die Anzugaufzählung in:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
müsste werden:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
um die in der Datenbank gespeicherten alten numerischen Werte beizubehalten.
So sortieren Sie sie in der Datenbank
Die Frage kommt auf: Nehmen wir an, ich wollte die Werte bestellen. Einige Leute möchten sie möglicherweise nach dem Ordnungswert der Aufzählung sortieren. Natürlich ist es bedeutungslos, die Karten nach dem numerischen Wert der Aufzählung zu ordnen:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
Das ist nicht die Reihenfolge, die wir wollen - wir wollen sie in Aufzählungsreihenfolge:
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
Die gleiche Arbeit, die zum Speichern von Ganzzahlwerten erforderlich ist, ist zum Speichern von Zeichenfolgen erforderlich:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Aber das ist nicht die Reihenfolge, die wir wollen - wir wollen sie in Aufzählungsreihenfolge:
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
Meiner Meinung nach gehört diese Art von Ranking in die Benutzeroberfläche. Wenn Sie Elemente nach ihrem Aufzählungswert sortieren: Sie machen etwas falsch.
Aber wenn Sie das wirklich tun wollten, würde ich eine SuitsDimensionstabelle erstellen :
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
Wenn Sie Ihre Karten ändern möchten, um Kissing Kings New Deck Order zu verwenden , können Sie sie auf diese Weise zu Anzeigezwecken ändern, ohne alle Ihre Daten wegzuwerfen:
| Suit | SuitID | Rank | Color | CardOrder |
|------------|--------------|---------------|--------|-----------|
| Unknown | 4 | 0 | NULL | NULL |
| Spade | 0 | 1 | Black | 1 |
| Diamond | 2 | 2 | Red | 1 |
| Club | 3 | 3 | Black | -1 |
| Heart | 1 | 4 | Red | -1 |
Jetzt trennen wir ein internes Programmierdetail (Aufzählungsname, Aufzählungswert) mit einer Anzeigeeinstellung, die für Benutzer bestimmt ist:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder