Biz asla artık sayısal sıralı değerler olarak numaralandırma saklamak; hata ayıklamayı ve desteği çok zor hale getirir. Dizeye dönüştürülen gerçek numaralandırma değerini saklarız:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
ve sonra şununla tekrar okuyun:
Suit theSuit = Suit.valueOf(reader["Suit"]);
Sorun geçmişte Enterprise Manager'a bakıp deşifre etmeye çalışmaktı:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
ayetler
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
ikincisi çok daha kolay. İlki, kaynak koduna girmeyi ve numaralandırma üyelerine atanan sayısal değerleri bulmayı gerektiriyordu.
Evet, daha fazla yer kaplıyor, ancak numaralandırma üye adları kısadır ve sabit diskler ucuzdur ve bir sorun yaşadığınızda yardım etmeye değer.
Ek olarak, sayısal değerler kullanırsanız, bunlara bağlanırsınız. Eski sayısal değerleri zorlamak zorunda kalmadan üyeleri güzel bir şekilde ekleyemez veya yeniden düzenleyemezsiniz. Örneğin, Suit numaralandırmasını şu şekilde değiştirmek:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
olması gerekirdi:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
veritabanında depolanan eski sayısal değerleri korumak için.
Bunları veritabanında nasıl sıralayabilirim?
Soru ortaya çıkıyor: Diyelim ki değerleri sipariş etmek istedim. Bazı insanlar bunları numaralamanın sıra değerine göre sıralamak isteyebilir. Elbette, kartları numaralandırmanın sayısal değerine göre sıralamak anlamsızdır:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
İstediğimiz sıra bu değil - onları numaralandırma sırasına göre istiyoruz:
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
Tamsayı değerlerini kaydederseniz gerekli olan işin aynısı, dizeleri kaydederseniz de gereklidir:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Ama istediğimiz sıra bu değil - onları numaralandırma sırasına göre istiyoruz:
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
Bence bu tür bir sıralama kullanıcı arayüzüne aittir. Öğeleri numaralandırma değerlerine göre sıralıyorsanız: yanlış bir şey yapıyorsunuz demektir.
Ama bunu gerçekten yapmak istiyorsanız, bir Suits
boyut tablosu oluşturardım :
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
Bu şekilde, Kissing Kings Yeni Deste Sırasını kullanmak için kartlarınızı değiştirmek istediğinizde, tüm verilerinizi atmadan görüntüleme amaçlı olarak değiştirebilirsiniz:
| 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 |
Şimdi dahili bir programlama ayrıntısını (numaralandırma adı, numaralandırma değeri) kullanıcılar için tasarlanmış bir görüntüleme ayarıyla ayırıyoruz:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder