Kami tidak pernah lagi menyimpan enumerasi sebagai nilai ordinal numerik; itu membuat proses debug dan dukungan menjadi terlalu sulit. Kami menyimpan nilai pencacahan aktual yang dikonversi ke string:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
dan kemudian baca kembali dengan:
Suit theSuit = Suit.valueOf(reader["Suit"]);
Masalahnya adalah di masa lalu saat menatap Manajer Perusahaan dan mencoba menguraikan:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
ayat-ayat
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
yang terakhir jauh lebih mudah. Yang pertama membutuhkan kode sumber dan menemukan nilai-nilai numerik yang diberikan kepada anggota pencacahan.
Ya, ini membutuhkan lebih banyak ruang, tetapi nama anggota pencacahan pendek, dan hard drive murah, dan jauh lebih berharga untuk membantu saat Anda mengalami masalah.
Selain itu, jika Anda menggunakan nilai numerik, Anda terikat padanya. Anda tidak dapat memasukkan atau mengatur ulang anggota dengan baik tanpa harus memaksakan nilai numerik lama. Misalnya, mengubah pencacahan Suit menjadi:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
harus menjadi:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
untuk mempertahankan nilai numerik warisan yang disimpan dalam database.
Bagaimana mengurutkannya di database
Muncul pertanyaan: katakanlah saya ingin memesan nilai. Beberapa orang mungkin ingin mengurutkannya berdasarkan nilai ordinal enum. Tentu saja, memesan kartu dengan nilai numerik dari pencacahan tidak ada artinya:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
Itu bukan urutan yang kami inginkan - kami menginginkannya dalam urutan pencacahan:
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
Pekerjaan yang sama yang diperlukan jika Anda menyimpan nilai integer diperlukan jika Anda menyimpan string:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Tapi itu bukan urutan yang kami inginkan - kami ingin mereka dalam urutan pencacahan:
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
Pendapat saya adalah bahwa peringkat semacam ini termasuk dalam antarmuka pengguna. Jika Anda menyortir item berdasarkan nilai pencacahannya: Anda melakukan kesalahan.
Tetapi jika Anda benar-benar ingin melakukannya, saya akan membuat Suitstabel dimensi:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
Dengan cara ini, ketika Anda ingin mengubah kartu Anda untuk menggunakan Kissing Kings New Deck Order, Anda dapat mengubahnya untuk tujuan tampilan tanpa membuang semua data Anda:
| 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 |
Sekarang kami memisahkan detail pemrograman internal (nama enumerasi, nilai enumerasi) dengan pengaturan tampilan yang ditujukan untuk pengguna:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder