เราไม่เคยจัดเก็บการแจงนับเป็นค่าลำดับตัวเลขอีกต่อไป ทำให้การดีบักและการสนับสนุนยากเกินไป เราจัดเก็บค่าการแจงนับจริงที่แปลงเป็นสตริง:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
แล้วอ่านกลับด้วย:
Suit theSuit = Suit.valueOf(reader["Suit"]);
ปัญหาในอดีตคือการจ้องมองที่ Enterprise Manager และพยายามถอดรหัส:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
โองการ
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
อย่างหลังง่ายกว่ามาก เดิมต้องการรับที่ซอร์สโค้ดและค้นหาค่าตัวเลขที่กำหนดให้กับสมาชิกการแจงนับ
ใช่มันใช้พื้นที่มากกว่า แต่ชื่อสมาชิกการแจงนับสั้นและฮาร์ดไดรฟ์มีราคาถูกและคุ้มค่ากว่ามากที่จะช่วยเหลือเมื่อคุณประสบปัญหา
นอกจากนี้หากคุณใช้ค่าตัวเลขคุณจะผูกติดอยู่กับค่านั้น คุณไม่สามารถแทรกหรือจัดเรียงสมาชิกใหม่ได้โดยไม่ต้องบังคับค่าตัวเลขเก่า ตัวอย่างเช่นการเปลี่ยนการแจงนับชุดสูทเป็น:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
จะต้องกลายเป็น:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
เพื่อรักษาค่าตัวเลขเดิมที่เก็บไว้ในฐานข้อมูล
วิธีการจัดเรียงในฐานข้อมูล
คำถามเกิดขึ้น: สมมติว่าฉันต้องการจัดลำดับค่า บางคนอาจต้องการเรียงลำดับตามค่าลำดับของ enum แน่นอนว่าการเรียงไพ่ตามค่าตัวเลขของการแจงนับนั้นไม่มีความหมาย:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
นั่นไม่ใช่ลำดับที่เราต้องการ - เราต้องการให้เรียงตามลำดับการแจงนับ:
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
งานเดียวกันกับที่จำเป็นหากคุณบันทึกค่าจำนวนเต็มเป็นสิ่งจำเป็นหากคุณบันทึกสตริง:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
แต่นั่นไม่ใช่ลำดับที่เราต้องการ - เราต้องการให้เรียงตามลำดับการแจงนับ:
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
ความคิดเห็นของฉันคือการจัดอันดับประเภทนี้อยู่ในอินเทอร์เฟซผู้ใช้ หากคุณกำลังจัดเรียงรายการตามค่าการแจงนับแสดงว่าคุณกำลังทำอะไรผิดพลาด
แต่ถ้าคุณอยากทำจริงๆฉันจะสร้างSuits
ตารางมิติ:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
ด้วยวิธีนี้เมื่อคุณต้องการเปลี่ยนการ์ดของคุณไปใช้Kissing Kings New Deck Orderคุณสามารถเปลี่ยนการ์ดเพื่อการแสดงผลโดยไม่ต้องทิ้งข้อมูลทั้งหมดของคุณ:
| 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 |
ตอนนี้เรากำลังแยกรายละเอียดการเขียนโปรแกรมภายใน (ชื่อการแจงนับค่าการนับ) ด้วยการตั้งค่าการแสดงผลสำหรับผู้ใช้:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder