Nigdy już nie przechowujemy wyliczeń jako liczbowych wartości porządkowych; to sprawia, że debugowanie i wsparcie jest zbyt trudne. Przechowujemy rzeczywistą wartość wyliczenia przekonwertowaną na ciąg:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
a następnie przeczytaj:
Suit theSuit = Suit.valueOf(reader["Suit"]);
W przeszłości problem polegał na wpatrywaniu się w Enterprise Manager i próbach rozszyfrowania:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
wersety
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
ta ostatnia jest znacznie łatwiejsza. Pierwsza wymagała dotarcia do kodu źródłowego i znalezienia wartości liczbowych, które zostały przypisane członkom wyliczenia.
Tak, zajmuje więcej miejsca, ale nazwy członków wyliczenia są krótkie, a dyski twarde są tanie i o wiele bardziej opłaca się pomóc, gdy masz problem.
Ponadto, jeśli używasz wartości liczbowych, jesteś z nimi związany. Nie można ładnie wstawiać ani zmieniać kolejności elementów bez konieczności wymuszania starych wartości liczbowych. Na przykład zmiana wyliczenia koloru na:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
musiałby się stać:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
w celu zachowania starszych wartości liczbowych przechowywanych w bazie danych.
Jak posortować je w bazie danych
Pojawia się pytanie: powiedzmy, że chciałem uporządkować wartości. Niektórzy ludzie mogą chcieć posortować je według wartości porządkowej wyliczenia. Oczywiście porządkowanie kart według wartości numerycznej wyliczenia jest bez znaczenia:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
To nie jest kolejność, której chcemy - chcemy, aby były one w kolejności wyliczania:
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
Ta sama praca, która jest wymagana przy zapisywaniu wartości całkowitych, jest wymagana przy zapisywaniu ciągów:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Ale to nie jest kolejność, której chcemy - chcemy, aby były one w kolejności wyliczania:
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
Uważam, że taki ranking należy do interfejsu użytkownika. Jeśli sortujesz elementy na podstawie ich wartości wyliczenia: robisz coś źle.
Ale jeśli naprawdę chcesz to zrobić, utworzyłbym Suits
tabelę wymiarów:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
W ten sposób, jeśli chcesz zmienić swoje karty, aby używać Kissing Kings New Deck Order , możesz to zmienić do celów wyświetlania bez wyrzucania wszystkich swoich danych:
| 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 |
Teraz oddzielamy wewnętrzny szczegół programowania (nazwa wyliczenia, wartość wyliczenia) ustawieniem wyświetlania przeznaczonym dla użytkowników:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder