Tại sao lưu trữ cờ / enums trong cơ sở dữ liệu dưới dạng chuỗi thay vì số nguyên?


29

Tôi đã duyệt các bản SQL của một số CMS nổi tiếng, bao gồm Drupal 7, Wordpress (một số phiên bản khá cũ) và một số ứng dụng tùy chỉnh dựa trên Python.

Tất cả các bãi chứa dữ liệu có cờ chuỗi thay vì số nguyên. Ví dụ, tình trạng của một bài được biểu diễn dưới dạng published, closedhay inherithơn 1, 2hoặc 3.

Tôi có kinh nghiệm khá hạn chế trong việc thiết kế cơ sở dữ liệu và tôi chưa bao giờ vượt qua các SQL đơn giản, nhưng tôi luôn được dạy rằng tôi nên sử dụng cờ số / số nguyên cho dữ liệu như thế này. Rõ ràng là tinyinttiêu thụ ít không gian trong cơ sở dữ liệu hơn, ví dụ , varchar(9).

Vậy tôi còn thiếu gì? Đây không phải là một sự lãng phí lưu trữ dữ liệu và dự phòng dữ liệu? Sẽ không duyệt, tìm kiếm và lập chỉ mục nhanh hơn một chút nếu các cột này sử dụng số nguyên thay vì chuỗi?


7
Bạn có chắc chắn họ không thực sự sử dụng dev.mysql.com/doc/refman/5.0/en/enum.html sẽ trông giống như một chuỗi trong kết xuất. Dù bằng cách nào tôi nghĩ rằng những ngày này nó gần như được tính là một tối ưu hóa vi mô.
Esben Skov Pedersen


2
Câu hỏi này về cơ bản là một kháng cáo lên chính quyền.
DeadMG

3
Không phải là một câu trả lời đầy đủ, nhưng ... bạn có biết ngôn ngữ kịch bản Lua không? Nổi tiếng là trực tiếp và hiệu suất cao, được sử dụng để viết toàn bộ công cụ trò chơi, vv? Đáng ngạc nhiên là đủ ... họ không bao giờ bận tâm đến việc có một loại số nào cả. Mã xử lý chuỗi của họ rất hiệu quả, họ có thể thêm các số với nhau thực sự là các chuỗi, trong mã công cụ trò chơi nhạy cảm với thời gian. Giống như JavaScript, chúng thậm chí không có các đối tượng - chỉ là các bảng băm rất lạ mắt. Quan điểm của lập trình viên C về "một mảng lớn của chars? Làm thế nào không hiệu quả!" đã lỗi thời so với năm 2015.
Katana314

2
Được chỉnh sửa để loại bỏ phần "kháng cáo lên chính quyền" và được mở lại, vì câu hỏi về việc sử dụng chuỗi thay vì ints hoàn toàn thuộc chủ đề miễn là nó không cụ thể về các "chính quyền" đó.
Ixrec

Câu trả lời:


45

Có, lưu trữ chuỗi thay vì số có thể sử dụng nhiều không gian hơn. Lý do mà các pltforms cao đang làm điều đó là vì họ nghĩ rằng lợi ích của giải pháp đó lớn hơn chi phí.

Những lợi ích là gì? Bạn có thể dễ dàng đọc kết xuất cơ sở dữ liệu và hiểu nội dung của nó mà không cần ghi nhớ các bảng enum và thậm chí GUI bán chính thức có thể chỉ cần sử dụng các giá trị chủ đề thay vì chuyển đổi bản ghi mà chúng nhận được. (Đây là một hình thức cơ bản của sự đánh đổi không gian đĩa / thời gian xử lý.)

Còn chi phí thì sao? Dung lượng lưu trữ dữ liệu đã không còn là nút cổ chai trong CMS trong một thời gian dài, vì các đĩa đã trở nên quá lớn và quá rẻ. Mặt khác, thời gian lập trình viên thường trở nên đắt đỏ hơn - vì vậy bất cứ điều gì đánh đổi nỗ lực phát triển cho không gian đĩa cũng là một điều tốt, từ quan điểm kinh doanh.


7

Có, lưu trữ những thứ như yeshoặc truesẽ chiếm nhiều không gian hơn một chút. Điều này không có gì đáng ngạc nhiên. Nó cũng làm cho việc lập chỉ mục và do đó tham gia kém hiệu quả hơn cho cơ sở dữ liệu. Nó cũng có hình phạt của sự nhầm lẫn có thể cho giá trị chính xác ( yesvs y) là gì.

Tuy nhiên, có nhiều cách tiếp cận trông giống như lưu trữ chuỗi trong cơ sở dữ liệu (cụ thể là MySQL) có hiệu quả.

Đầu tiên, MySQL có một enumloại ( tài liệu ) có thể trông rất giống một bộ chuỗi Boolean hoặc bị hạn chế khi thiết lập theo cách đó. Nó cũng thực thi chỉ các giá trị hợp lệ được nhập. Điều này thường hữu ích hơn nhiều so với việc lưu trữ 1, 2hoặc 3như một giá trị như ý nghĩa được truyền đạt với thông tin. Enum đi kèm với hình phạt là cần phải thay đổi lược đồ để thêm hoặc xóa các loại.

Điều này đưa chúng ta đến một bảng con và khóa ngoại (áp dụng cho tất cả các cơ sở dữ liệu). Vâng, bạn đang lưu trữ một số giá trị như một chìa khóa (trở lại 1, 2hoặc 3) và giá trị của published, closedinheritđược lưu trữ trong bảng khác. Sử dụng một khung nhìn ( docs ) sau đó có thể làm cho nó trông giống như bảng chứa chuỗi chứ không phải là khóa. Điều này có lợi thế là không cần thay đổi lược đồ để thêm hoặc xóa các mục từ bảng con.

Chính xác cách thức mọi thứ được lưu trữ sẽ yêu cầu người ta nhìn vào DDL thực tế của lược đồ để xác định phương thức nào được sử dụng và nhận được một số gợi ý về sự đánh đổi mà họ đã chọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.