Vị trí mặc định của tôi là cố gắng sử dụng các loại mạnh để thêm các ràng buộc vào các giá trị - nơi bạn biết trước các giá trị đó.Như vậy trong ví dụ của bạn, có thể thích hợp hơn khi sử dụng byte dayOfWeek
vì nó gần với phạm vi giá trị mong muốn của bạn hơn.
Đây là lý do của tôi; với ví dụ về lưu trữ và vượt qua một phần năm của một ngày. Phần năm - khi xem xét các phần khác của hệ thống bao gồm SQL Server DateTimes, bị giới hạn từ 1753 đến 9999 (lưu ý phạm vi có thể của C# cho DateTime là khác nhau!) Vì vậy, short
bao gồm các giá trị có thể của tôi và nếu tôi cố gắng vượt qua bất kỳ điều gì lớn hơn trình biên dịch sẽ cảnh báo tôi trước khi mã sẽ biên dịch. Thật không may, trong ví dụ cụ thể này, thuộc tính C# DateTime.Year sẽ trả về một int - do đó buộc tôi phải truyền kết quả nếu tôi cần phải vượt qua ví dụ: DateTime.Now.Year
vào chức năng của tôi.
Vị trí bắt đầu này được xem xét bởi lưu trữ dài hạn dữ liệu, giả sử 'hàng triệu hàng' và dung lượng đĩa - mặc dù giá rẻ (giá rẻ hơn nhiều khi bạn được lưu trữ và chạy SAN hoặc giống). Trong một ví dụ DB khác, tôi sẽ sử dụng các loại nhỏ hơn như byte (SQL Server tinyint) cho ID tra cứu, nơi tôi tự tin rằng sẽ không có nhiều kiểu tra cứu, thông qua từ lâu (SQL Server bigint) cho id ở đó có thể sẽ có nhiều hồ sơ hơn. tức là để bao gồm các hồ sơ giao dịch.
Vì vậy, quy tắc của tôi của ngón tay cái:
- Go cho đúng đắn đầu tiên nếu có thể. Sử dụng DayOfWeek trong ví dụ của bạn, tất nhiên :)
- Đi cho một loại kích thước thích hợp do đó làm cho việc sử dụng kiểm tra an toàn biên dịch cho bạn lỗi trong thời gian sớm nhất có thể;
- ... nhưng bù đắp với nhu cầu hiệu suất cực kỳ và đơn giản, đặc biệt là nơi lưu trữ lâu dài không được tham gia hoặc chúng tôi đang xem xét bảng tra cứu (số lượng hàng thấp) thay vì một giao dịch (số lượng hàng cao).
Vì lợi ích của sự rõ ràng, bộ nhớ DB có xu hướng không co lại nhanh như bạn mong đợi bằng cách thu hẹp các loại cột từ bigint thành các loại nhỏ hơn. Điều này là do việc đệm vào các ranh giới từ và các vấn đề kích thước trang bên trong DB. Tuy nhiên, bạn có thể lưu trữ tất cả các mục dữ liệu nhiều lần trong DB của bạn, có lẽ thông qua lưu trữ hồ sơ lịch sử khi chúng thay đổi, và cũng giữ vài ngày cuối cùng của sao lưu và sao lưu đăng nhập. Vì vậy, tiết kiệm một vài phần trăm nhu cầu lưu trữ của bạn sẽ có tiết kiệm dài hạn trong chi phí lưu trữ. Tôi chưa bao giờ gặp vấn đề cá nhân khi hiệu suất trong bộ nhớ của byte so với ints là một vấn đề, nhưng tôi đã lãng phí giờ và giờ phải tái phân bổ dung lượng đĩa và máy chủ sống hoàn toàn ngừng vì không có ai có sẵn để theo dõi và quản lý những thứ như vậy.
Đối với ví dụ _particular_ đó, tôi sẽ không sử dụng int _or_ a byte. Một enum sẽ tốt hơn trong trường hợp đó (2 nghĩa là gì? Thứ Ba? Thứ Hai?). Tôi biết bạn đang khái quát hóa, nhưng một số trường hợp cụ thể có thể được xử lý tốt hơn với một cái gì đó khác với một loại số nghiêm ngặt. –
Theo như hiệu quả đi - bạn có thể không thực sự nói mà không có hồ sơ. Nếu bạn không định hình, bạn không tối ưu hóa. – kyoryu