2009-09-02 23 views
5

giải pháp tốt nhất về mặt hiệu năng và "khả năng đọc/kiểu mã hóa tốt" để biểu diễn một (Java) Enumeration (cố định các hằng số) trên lớp DB liên quan đến một số nguyên (hoặc bất kỳ kiểu dữ liệu nào nói chung) một chuỗi đại diện.Cách thể hiện tốt nhất các hằng số (Enums) trong cơ sở dữ liệu (INT vs VARCHAR)?

Lưu ý: Có một số hệ thống cơ sở dữ liệu hỗ trợ trực tiếp "Enums" nhưng điều này sẽ yêu cầu phải đồng bộ hóa cơ sở dữ liệu Enum-Definition đồng bộ với triển khai lớp kinh doanh. Hơn nữa kiểu dữ liệu này có thể không có sẵn trên tất cả các hệ thống cơ sở dữ liệu và cũng có thể khác với cú pháp => Tôi đang tìm một giải pháp dễ dàng để quản lý và có sẵn trên tất cả các hệ thống cơ sở dữ liệu. (Vì vậy, câu hỏi của tôi chỉ áp dụng biểu diễn Số vs Chuỗi.)

Biểu diễn số của một hằng số dường như rất hiệu quả để lưu trữ (ví dụ chỉ tiêu thụ hai byte là số nguyên) và rất có khả năng lập chỉ mục rất nhanh nhưng khó đọc ("0" so với "1", v.v.)

Biểu diễn chuỗi dễ đọc hơn (lưu trữ "đã bật" và "bị tắt" so với "0" và "1") nhưng tiêu thụ nhiều không gian lưu trữ mor và rất có thể cũng chậm hơn trong việc lập chỉ mục.

Câu hỏi của tôi là, tôi có bỏ lỡ một số khía cạnh quan trọng không? Những gì bạn sẽ đề nghị sử dụng cho một đại diện enum trên lớp cơ sở dữ liệu.

Cảm ơn bạn rất nhiều!

+0

Sao chép chính xác: http://stackoverflow.com/questions/229856/ways-to-save-enums-in-database – ChssPly76

Trả lời

3

Trong hầu hết các trường hợp, tôi thích sử dụng mã chữ số ngắn và sau đó có bảng tra cứu có văn bản mở rộng. Khi cần thiết, tôi xây dựng bảng enum trong chương trình động từ bảng cơ sở dữ liệu.

Ví dụ: giả sử chúng tôi có trường có nghĩa vụ chứa, loại giao dịch và các giá trị có thể là Bán, Trả lại, Dịch vụ và Layaway. Tôi muốn tạo một bảng kiểu giao dịch với mã và mô tả, làm cho các mã có thể là "SA", "RE", "SV" và "LY" và sử dụng trường mã làm khóa chính. Sau đó, trong mỗi bản ghi giao dịch, tôi sẽ đăng mã đó. Điều này có ít không gian hơn một phím nguyên trong bản ghi và trong chỉ mục. Chính xác cách nó được xử lý phụ thuộc vào công cụ cơ sở dữ liệu nhưng nó không phải là đáng kể ít hiệu quả hơn một phím số nguyên. Và bởi vì nó rất dễ sử dụng. Bạn có thể đổ một bản ghi và dễ dàng nhìn thấy những gì các giá trị và có khả năng nhớ đó là những gì. Bạn có thể hiển thị các mã mà không cần dịch trong đầu ra của người dùng và người dùng có thể hiểu được chúng. Thật vậy, điều này có thể mang lại cho bạn hiệu suất cao hơn các phím số nguyên: Trong nhiều trường hợp, chữ viết tắt là tốt cho người dùng - họ thường muốn viết tắt để hiển thị nhỏ gọn và tránh cuộn - vì vậy bạn không cần phải tham gia vào bảng giao dịch để có được bản dịch.

Tôi chắc chắn KHÔNG lưu trữ giá trị văn bản dài trong mọi bản ghi. Giống như trong ví dụ này, tôi sẽ không muốn phân chia với bảng giao dịch và lưu trữ "Layaway". Không chỉ là điều này không hiệu quả, nhưng nó là khá có thể là một ngày nào đó người dùng sẽ nói rằng họ muốn nó thay đổi để "bán hàng Layaway", hoặc thậm chí một số sự khác biệt tinh tế như "Lay-away". Sau đó, bạn không chỉ phải cập nhật mọi bản ghi trong cơ sở dữ liệu, nhưng bạn phải tìm kiếm thông qua chương trình cho mọi nơi mà văn bản này xuất hiện và thay đổi nó.Ngoài ra, văn bản càng dài, càng có nhiều khả năng một nơi nào đó nằm dọc theo đường kẻ lập trình sẽ đánh vần nó và tạo ra các lỗi không rõ ràng.

Ngoài ra, việc có bảng loại giao dịch cung cấp một nơi thuận tiện để lưu trữ thông tin bổ sung về loại giao dịch. Không bao giờ từng viết mã có nội dung "if whatevercode = 'A' hoặc whatevercode = 'C' hoặc whatevercode = 'X' thì ..." Dù đó là gì làm cho ba mã đó khác với các mã khác, hãy đặt một trường cho nó trong bảng giao dịch và kiểm tra trường đó. Nếu bạn nói, "Vâng, đó là tất cả các mã liên quan đến thuế" hoặc bất cứ điều gì, sau đó tốt, tạo ra một lĩnh vực được gọi là "tax_related" và đặt nó thành true hoặc false cho mỗi giá trị mã khi thích hợp. Nếu không, khi ai đó tạo ra một loại giao dịch mới, họ phải xem xét tất cả các loại đó nếu/hoặc liệt kê và tìm ra loại giao dịch nào sẽ được thêm vào và loại nào không nên. Tôi đã đọc rất nhiều chương trình khó hiểu mà tôi phải tìm ra lý do tại sao một số logic áp dụng cho ba giá trị mã này chứ không phải những giá trị mã khác và khi bạn nghĩ rằng giá trị thứ tư phải được đưa vào danh sách, rất khó để biết liệu nó có mất tích vì nó thực sự khác biệt theo một cách nào đó, hoặc nếu lập trình viên mắc lỗi.

Loại duy nhất tôi không tạo bảng dịch là khi danh sách rất ngắn, không có thêm dữ liệu để giữ, và rõ ràng là bản chất của vũ trụ mà nó không bao giờ thay đổi để các giá trị có thể được mã hóa một cách an toàn. Giống như true/false hoặc positive/negative/zero hoặc male/female. (Và này, ngay cả điều cuối cùng, rõ ràng là có vẻ như, có những người khăng khăng rằng chúng ta hiện nay bao gồm "chuyển giới" và những thứ tương tự.)

Một số người đều nhấn mạnh rằng mỗi bảng đều có một phím số nguyên được tạo tự động. Các khóa như vậy là một lựa chọn tuyệt vời trong nhiều trường hợp, nhưng đối với các danh sách mã, tôi thích khóa alpha ngắn hơn vì những lý do đã nêu ở trên.

1

Tôi sẽ lưu trữ biểu diễn chuỗi, vì điều này dễ dàng tương quan lại với enum và ổn định hơn nhiều. Sử dụng thứ tự() sẽ là xấu bởi vì nó có thể thay đổi nếu bạn thêm một enum mới vào giữa của bộ truyện, vì vậy bạn sẽ phải thực hiện hệ thống đánh số của riêng bạn. Về mặt hiệu suất, tất cả phụ thuộc vào những gì enums sẽ được sử dụng, nhưng nó rất có thể là một tối ưu hóa sớm để phát triển một đại diện riêng biệt hoàn toàn với chuyển đổi hơn là chỉ sử dụng biểu diễn String tự nhiên.

Các vấn đề liên quan