Câu trả lời cho câu hỏi của bạn là hợp lý, không phải là vật chất - giá trị bạn tìm kiếm có thể thay đổi vì lý do kinh doanh. Ví dụ: nếu bạn lập chỉ mục khách hàng của mình theo địa chỉ email, điều gì xảy ra khi địa chỉ email thay đổi? Rõ ràng điều này sẽ không áp dụng cho tất cả các bảng tra cứu của bạn, nhưng lợi ích của việc thực hiện theo cùng một cách trên toàn bộ ứng dụng là nó làm cho mã của bạn đơn giản hơn. Nếu tất cả mọi thứ là số nguyên → quan hệ số nguyên trong nội bộ, bạn được bảo vệ.
Chỉ cần đọc nhận xét của bạn cho Sandy - có lẽ trong trường hợp này điều bạn thực sự muốn là Kiểm tra ràng buộc , không phải bảng ngoại khóa / tra cứu, ví dụ:
create table icecream (flavour varchar(10))
go
alter table icecream add constraint ck_flavour check (flavour in ('Orange', 'Pista', 'Mango'))
go
insert into icecream (flavour) values ('Orange')
go
insert into icecream (flavour) values ('Vanilla')
go
Chạy cái này và bạn nhận được:
(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_flavour". The conflict occurred in database "GAIUSDB", table "dbo.icecream", column 'flavour'.
The statement has been terminated.
Đây là một phương pháp hiệu quả, hiệu suất cao, nhưng nhược điểm của khóa học là thêm một hương vị mới có nghĩa là thay đổi mã. Tôi sẽ khuyên bạn không nên làm điều đó trong ứng dụng - bởi vì sau đó bạn cần thực hiện nó trong mọi ứng dụng kết nối với DB này, đây là thiết kế sạch nhất có thể vì chỉ có một đường dẫn mã duy nhất để thực hiện xác nhận.