Chúng tôi không bao giờ lưu trữ các bảng liệt kê dưới dạng giá trị số thứ tự nữa; nó làm cho việc gỡ lỗi và hỗ trợ trở nên quá khó khăn. Chúng tôi lưu trữ giá trị liệt kê thực tế được chuyển đổi thành chuỗi:
public enum Suit { Spade, Heart, Diamond, Club }
Suit theSuit = Suit.Heart;
szQuery = "INSERT INTO Customers (Name, Suit) " +
"VALUES ('Ian Boyd', %s)".format(theSuit.name());
và sau đó đọc lại với:
Suit theSuit = Suit.valueOf(reader["Suit"]);
Vấn đề trước đây là do Enterprise Manager nhìn chằm chằm và cố gắng giải mã:
Name Suit
================== ==========
Shelby Jackson 2
Ian Boyd 1
câu thơ
Name Suit
================== ==========
Shelby Jackson Diamond
Ian Boyd Heart
cái sau dễ dàng hơn nhiều. Yêu cầu trước đây là truy cập mã nguồn và tìm các giá trị số đã được gán cho các thành viên điều tra.
Có, nó chiếm nhiều dung lượng hơn, nhưng tên thành viên điều tra ngắn, và ổ cứng rẻ, và nó đáng để giúp đỡ khi bạn gặp sự cố.
Ngoài ra, nếu bạn sử dụng các giá trị số, bạn bị ràng buộc với chúng. Bạn không thể chèn hoặc sắp xếp lại các thành viên một cách độc đáo mà không cần phải ép các giá trị số cũ. Ví dụ: thay đổi kiểu liệt kê Suit thành:
public enum Suit { Unknown, Heart, Club, Diamond, Spade }
sẽ phải trở thành:
public enum Suit {
Unknown = 4,
Heart = 1,
Club = 3,
Diamond = 2,
Spade = 0 }
để duy trì các giá trị số kế thừa được lưu trữ trong cơ sở dữ liệu.
Cách sắp xếp chúng trong cơ sở dữ liệu
Câu hỏi xuất hiện: giả sử tôi muốn sắp xếp các giá trị. Một số người có thể muốn sắp xếp chúng theo giá trị thứ tự của enum. Tất nhiên, việc sắp xếp các thẻ theo giá trị số của phép liệt kê là vô nghĩa:
SELECT Suit FROM Cards
ORDER BY SuitID; --where SuitID is integer value(4,1,3,2,0)
Suit
------
Spade
Heart
Diamond
Club
Unknown
Đó không phải là thứ tự chúng tôi muốn - chúng tôi muốn chúng theo thứ tự liệt kê:
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
Công việc tương tự được yêu cầu nếu bạn lưu các giá trị số nguyên nếu bạn lưu các chuỗi:
SELECT Suit FROM Cards
ORDER BY Suit; --where Suit is an enum name
Suit
-------
Club
Diamond
Heart
Spade
Unknown
Nhưng đó không phải là thứ tự chúng tôi muốn - chúng tôi muốn chúng theo thứ tự liệt kê:
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
Ý kiến của tôi là loại xếp hạng này thuộc về giao diện người dùng. Nếu bạn đang phân loại các mục dựa trên giá trị liệt kê của chúng: bạn đang làm sai.
Nhưng nếu bạn thực sự muốn làm điều đó, tôi sẽ tạo một Suits
bảng thứ nguyên:
| Suit | SuitID | Rank | Color |
|------------|--------------|---------------|--------|
| Unknown | 4 | 0 | NULL |
| Heart | 1 | 1 | Red |
| Club | 3 | 2 | Black |
| Diamond | 2 | 3 | Red |
| Spade | 0 | 4 | Black |
Bằng cách này, khi bạn muốn thay đổi quân bài của mình để sử dụng Thứ tự Bộ bài Mới Kissing Kings, bạn có thể thay đổi nó cho mục đích hiển thị mà không cần vứt bỏ tất cả dữ liệu của mình:
| 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 |
Bây giờ chúng tôi đang tách một chi tiết lập trình nội bộ (tên liệt kê, giá trị liệt kê) với cài đặt hiển thị dành cho người dùng:
SELECT Cards.Suit
FROM Cards
INNER JOIN Suits ON Cards.Suit = Suits.Suit
ORDER BY Suits.Rank,
Card.Rank*Suits.CardOrder