INT hoặc CHAR cho Trường Loại


19

Thiết kế tốt nhất cho một bảng, một Typelĩnh vực là inthoặc là char(1)gì? Nói cách khác, đưa ra lược đồ này:

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

Là nó hiệu quả hơn (hiệu suất khôn ngoan) VehTypeđể là một inthoặc một char(1)? Giả sử bạn có năm loại ô tô, bạn có nên sử dụng các giá trị tăng 0 -> 4 hoặc ký tự cho các loại (giả sử 'v', 's', 'c', 't', 'm')?

Nếu còn hơn thế nữa, tôi sẽ sử dụng bảng Loại riêng và có mối quan hệ khóa ngoài, nhưng tôi không thấy sự cần thiết đó.

Tôi nhận thấy rằng sys.objectschế độ xem danh mục sử dụng một ký tự cho typetrường. Có một lý do cho điều đó? Tôi chỉ đang chộp lấy không khí mỏng manh ở đây, và đó có phải là bất cứ điều gì tôi thấy thoải mái hơn không?

Câu trả lời:


20

Bạn thường sử dụng tinyint là 1 byte

  • char (1) sẽ chậm hơn một chút vì so sánh sử dụng đối chiếu

  • nhầm lẫn: S: SUV hoặc Saloon hoặc Sedan hoặc Sports là gì?

  • sử dụng một chữ cái giới hạn bạn khi bạn thêm nhiều loại. Xem điểm cuối cùng.

  • mỗi hệ thống tôi thấy có nhiều hơn một khách hàng, ví dụ như báo cáo. Logic của việc thay đổi V, S thành "Van", "SUV", v.v sẽ cần lặp lại. Sử dụng bảng tra cứu có nghĩa là nó THAM GIA đơn giản

  • khả năng mở rộng: thêm một loại nữa ("F" cho " Xe bay ") bạn có thể một hàng vào bảng tra cứu hoặc thay đổi nhiều mã và các ràng buộc. Và mã máy khách của bạn cũng vậy vì điều này phải biết V, S, F, v.v.

  • bảo trì: logic ở 3 vị trí: ràng buộc cơ sở dữ liệu, mã cơ sở dữ liệu và mã máy khách. Với một tra cứu và khóa ngoại, nó có thể ở một nơi

Về mặt tích cực của việc sử dụng một chữ cái ... er, không thấy bất kỳ

Lưu ý: có một câu hỏi MySQL liên quan về Enums . Đề xuất là sử dụng một bảng tra cứu ở đó quá.


2
điểm tuyệt vời. Nó khiến tôi tự hỏi tại sao những người khác sử dụng char (1) (như sys.objects).
Thomas Stringer

2
sys.objects có một di sản quay trở lại Sybase và các phiên bản đầu tiên của SQL Server en.wikipedia.org/wiki/Microsoft_Query_Server#Genesis Nếu bạn nhìn vào các đối tượng hệ thống, bạn có thể thấy các mã không phải là ID trên tất cả: nhưng ít hơn trong DMV mới. Còn đối với dân gian khác trừ MS? Hãy suy nghĩ RDBMS chứ không phải OO / Enums và sử dụng Tra cứu là hợp lý.
gbn

1
OK tôi đồng ý. Cảm ơn đã làm cho rõ ràng. Vì vậy, có phải là một tuyên bố khá chính xác rằng không có kỹ thuật quá mức thực sự với tính toàn vẹn quan hệ và bảng tra cứu? Ý tôi là, trong trường hợp này với việc lưu trữ một số ít hồ sơ trong bảng tra cứu và tham chiếu chúng trong bảng tiêu thụ, liệu tuyên bố trước đó có chính xác không?
Thomas Stringer

1
@encedaywhen: Nó tạo ra sự khác biệt khi bạn xem các loại khác nhau dưới dạng dữ liệu hoặc dưới dạng tập hợp giá trị tĩnh sẽ không bao giờ thay đổi. Nếu bạn sử dụng bảng loại, bạn có thể chỉ cần thêm loại khác vào bảng mà không cần thay đổi quy tắc kinh doanh trong cơ sở dữ liệu và trong ứng dụng.
Guffa

1
@ MichaelKjorling: Đúng, nếu đó chỉ là một chìa khóa. Nhưng OP dự định nó có nghĩa là "v" hoặc "s". Lưu ý, chúng tôi không nói về việc tự mô tả và hoàn thành các khóa tự nhiên như mã tiền tệ (EUR, USD, GBP, CHF, v.v.).
gbn

3

Cũng như một bổ sung cho câu trả lời tuyệt vời của gbn .

Có lẽ bạn có thể tạo ra một cái gì đó như thế:

create table dbo.VehicleType
(
    VehicleTypeId int not null primary key,
    Name varchar(50) not null,
    Code char(3) null
) 
go 

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehTypeId int not null ,
    foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
)
go 

Vì vậy, bạn có thể làm như bạn muốn với enum của bạn trong khi duy trì tính toàn vẹn quan hệ (sử dụng khóa ngoại). Với codecột bạn có thể sử dụng mã char của mình theo ý muốn, do đó, nó sẽ trở thành tài liệu trên cơ sở dữ liệu (và bạn có thể trích xuất thông tin mã trực tiếp từ DB, mà không cần chuyển đổi phức tạp trên mã ứng dụng để tích hợp hệ thống).


Bạn có nghĩa là cho phép một nullmã?
Jack Douglas

Vâng, mã là tùy chọn để cho phép đại diện cho một loại phương tiện chưa được mã hóa.
Fabricio Araujo

Tại sao mọi người thích ở lại xóa bình luận? Là khá khó chịu.
Fabricio Araujo

@FovenioAraujo - Nếu một bình luận đã lỗi thời (ví dụ: "Tôi sẽ chỉnh sửa câu trả lời của tôi" và sau đó bạn thực sự làm như vậy) thì thật tốt để làm sạch các bình luận không còn áp dụng.
Nick Chammas

1
Tôi sẽ đề nghị thêm loại "Chưa được phân loại" vào bảng loại của bạn và tạo giá trị mặc định của trường VehTypeId thành giá trị không được phân loại, thay vì cho phép giá trị null trong trường khóa ngoài. Nói chung, thực tế xấu là làm cho "null" có ý nghĩa kinh doanh hợp lệ.
Michael Blackburn
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.