Câu trả lời này là dành cho SQL tiêu chuẩn ISO/IEC/ANSI và bao gồm các phần mềm giả vờ-phần mềm miễn phí tốt hơn.
Vấn đề đầu tiên là bạn đã xác định hai Danh mục, chứ không phải một danh mục, vì vậy chúng không thể được so sánh một cách hợp lý.
A. Loại One
(1) (4) và (5) chứa nhiều giá trị có thể và là một danh mục. Tất cả có thể được sử dụng dễ dàng và hiệu quả trong mệnh đề WHERE. Chúng có cùng dung lượng để lưu trữ và hiệu suất đọc không phải là vấn đề. Do đó, lựa chọn còn lại đơn giản dựa trên Datatype thực tế cho mục đích của cột.
ENUM không chuẩn; phương pháp tốt hơn hoặc tiêu chuẩn là sử dụng bảng tra cứu; sau đó các giá trị được hiển thị trong bảng, không bị ẩn và có thể được liệt kê bởi bất kỳ công cụ báo cáo nào. Hiệu suất đọc của ENUM sẽ bị ảnh hưởng nhỏ do xử lý nội bộ.
B. Danh mục Hai
(2) và (3) là hai yếu tố có giá trị: Đúng/Sai; Nam nữ; Xác sống. Danh mục đó khác với Danh mục Một. Điều trị của nó cả trong mô hình dữ liệu của bạn, và trong mỗi nền tảng, là khác nhau. BOOLEAN chỉ là một từ đồng nghĩa với BIT, chúng giống nhau. Về mặt pháp lý (SQL-khôn ngoan) được xử lý giống nhau bởi tất cả các nền tảng tuân thủ SQL, và không có vấn đề gì khi sử dụng nó trong mệnh đề WHERE.
Sự khác biệt về hiệu suất phụ thuộc vào nền tảng. Sybase và DB2 đóng gói tới 8 BIT thành một byte (không phải là lưu trữ quan trọng ở đây), và ánh xạ năng lượng-của-hai khi đang bay, vì vậy hiệu năng thực sự tốt.Oracle làm những việc khác nhau trong mỗi phiên bản, và tôi đã thấy các modellers sử dụng CHAR (1) thay vì BIT, để khắc phục các vấn đề về hiệu năng. MS đã được phạt đến năm 2005 nhưng họ đã phá vỡ nó với năm 2008, như trong kết quả là không thể đoán trước; vì vậy câu trả lời ngắn có thể là thực hiện nó như CHAR (1).
Tất nhiên, giả định là bạn không làm những điều ngớ ngẩn như gói 8 cột riêng biệt trong một TINYINT. Không chỉ là một lỗi bình thường nghiêm trọng, nó là một cơn ác mộng đối với các lập trình viên. Giữ mỗi cột rời rạc và đúng Datatype.
C. Nhiều chỉ số & Cột Nullable
này không có gì để làm với, và không phụ thuộc, (A) và (B). Những cột đúng Datatype là, là riêng biệt với bao nhiêu bạn có và cho dù đó là Nullable. Nullable phương tiện (thường) cột là tùy chọn. Về cơ bản bạn đã không hoàn thành việc mô hình hóa hoặc tập thể dục bình thường hóa. Các phụ thuộc chức năng không rõ ràng. nếu bạn hoàn thành bài tập Bình thường hóa, sẽ không có các cột không thể bỏ qua, không có cột tùy chọn; hoặc chúng tồn tại rõ ràng cho một mối quan hệ cụ thể, hoặc chúng không tồn tại. Điều đó có nghĩa là sử dụng cấu trúc quan hệ thông thường của Supertype-Subtypes.
Chắc chắn, điều đó có nghĩa là nhiều bảng hơn, nhưng không có Null. Enterpise DBMS không có vấn đề với nhiều bảng hơn hoặc nhiều hơn tham gia, đó là những gì họ được tối ưu hóa cho. Các cơ sở dữ liệu được chuẩn hóa thực hiện tốt hơn nhiều so với các cơ sở dữ liệu không chuẩn hóa hoặc không chuẩn hóa, và chúng có thể được mở rộng mà không cần phải "tái thanh toán" Bạn có thể dễ dàng sử dụng bằng cách cung cấp một View cho mỗi Subtype. tại question/answer này. Nếu bạn cần giúp đỡ với các mô hình, hãy hỏi một câu hỏi mới. ở cấp lại đặt câu hỏi, tôi sẽ khuyên bạn gắn bó với 5NF.
D. hiệu suất của Nulls
riêng, nếu hiệu suất Mỗi cột Nullable được lưu trữ dưới dạng độ dài thay đổi, yêu cầu xử lý bổ sung cho mỗi hàng/cột. s sử dụng xử lý "trì hoãn" cho các hàng như vậy, để cho phép ghi nhật ký, v.v. di chuyển suy nghĩ các hàng đợi mà không cản trở các hàng cố định. Cụ thể không bao giờ sử dụng các cột có độ dài biến đổi (bao gồm các cột có thể bỏ qua) trong một Chỉ mục: yêu cầu giải nén trên mọi quyền truy cập.
E. Thăm dò ý kiến
Cuối cùng, tôi không thấy điểm trong câu hỏi này là cuộc thăm dò ý kiến. Nó đủ công bằng mà bạn sẽ nhận được câu trả lời kỹ thuật và thậm chí cả ý kiến, nhưng cuộc thăm dò ý kiến cho các cuộc thi phổ biến và khả năng kỹ thuật của người trả lời tại SO bao gồm rất nhiều, vì vậy câu trả lời phổ biến nhất và câu trả lời chính xác nhất là hai câu hỏi khác nhau kết thúc của quang phổ.
Bạn có thể bao gồm liên kết hoặc thông tin thêm về cách "MS được xử lý đến năm 2005 nhưng đã phá vỡ năm 2008, vì kết quả là không thể đoán trước" và nếu nó bị hỏng trong 2K8R2 –
@RC. Tôi không có liên kết, tôi có kinh nghiệm. Wiki chưa từng nghe về nó. Kết quả của bối cảnh cụ thể ở trên và một số trường hợp khác, không phải tất cả các ngữ cảnh đều không thể đoán trước được; nếu bạn có mã hoạt động tốt dưới năm 2005. Tôi đã đăng một số chi tiết cụ thể khác: xóa các trang tràn và làm tổn thương tất cả hiệu suất trên các chỉ mục Nhóm, v.v. Hãy đọc chúng. Không cố định trong Rev 2. Không có khả năng những yếu tố này được sửa cho đến khi Rev 4 ít nhất. Phải mất MS hơn 3 năm để sửa chữa năm 2005. – PerformanceDBA