Noi non memorizzare le enumerazioni come valori numerici ordinali più; rende il debug e il supporto troppo difficili. Memorizziamo il valore di enumerazione effettivo convertito in stringa:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
e poi rileggi con:
Suit theSuit = Suit.valueOf(reader["Suit"]);
Il problema in passato era fissare Enterprise Manager e cercare di decifrare:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
versi
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
quest'ultimo è molto più semplice. Il primo richiedeva di ottenere il codice sorgente e di trovare i valori numerici assegnati ai membri dell'enumerazione.
Sì, richiede più spazio, ma i nomi dei membri dell'enumerazione sono brevi e i dischi rigidi sono economici, ed è molto più utile che ti aiuti quando hai un problema.
Inoltre, se usi valori numerici, sei legato ad essi. Non è possibile inserire o riorganizzare correttamente i membri senza dover forzare i vecchi valori numerici. Ad esempio, modificando l'enumerazione Suit in:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
dovrebbe diventare:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
per mantenere i valori numerici precedenti memorizzati nel database.
Come ordinarli nel database
La domanda sorge spontanea: diciamo che volevo ordinare i valori. Alcune persone potrebbero volerli ordinare in base al valore ordinale dell'enumerazione. Naturalmente, ordinare le carte in base al valore numerico dell'enumerazione non ha senso:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
Non è l'ordine che vogliamo, li vogliamo in ordine di enumerazione:
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
Lo stesso lavoro richiesto se si salvano valori interi è richiesto se si salvano le stringhe:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Ma non è l'ordine che vogliamo, li vogliamo in ordine di enumerazione:
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
La mia opinione è che questo tipo di classifica appartenga all'interfaccia utente. Se stai ordinando gli elementi in base al loro valore di enumerazione: stai facendo qualcosa di sbagliato.
Ma se volessi farlo davvero, creerei una Suits
tabella delle dimensioni:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
In questo modo, quando vuoi cambiare le tue carte per usare Kissing Kings New Deck Order , puoi cambiarlo a scopo di visualizzazione senza buttare via tutti i tuoi dati:
| 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 |
Ora stiamo separando un dettaglio di programmazione interna (nome dell'enumerazione, valore dell'enumerazione) con un'impostazione di visualizzazione pensata per gli utenti:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder