Tại sao sử dụng int làm khóa chính của bảng tra cứu?


30

Tôi muốn biết lý do tại sao tôi nên sử dụng khóa chính làm bảng tra cứu thay vì chỉ sử dụng giá trị tra cứu làm khóa chính (trong hầu hết các trường hợp sẽ là một chuỗi).

Tôi hiểu rằng sử dụng một nvarchar (50) chứ không phải int sẽ sử dụng nhiều không gian hơn nếu nó được liên kết với một bảng có nhiều bản ghi.

Mặt khác, sử dụng trực tiếp giá trị tra cứu sẽ giúp chúng tôi tiết kiệm được việc tham gia. Tôi có thể tưởng tượng đây sẽ là một khoản tiết kiệm lớn nếu luôn luôn cần phải tham gia (Chúng tôi đang làm việc trên một ứng dụng web nên việc này khá nhiều).

Những lợi thế của việc sử dụng khóa chính int (cụ thể cho bảng tra cứu) ngoài việc nó là "điều tiêu chuẩn phải làm" là gì?


4
Bạn có thể tìm thấy thông tin tốt và thậm chí có thể là câu trả lời cần thiết của bạn trong 2 câu hỏi trước: Có lợi ích nào của khóa chính bao gồm tất cả các cột của bảng không? khóa chínhký tự vs Integer .
Mary

Câu trả lời:


23

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.


@ Gaius- Ví dụ hay ... Tôi không thích sử dụng Kiểm tra ràng buộc cho loại kịch bản này; lý do chính khiến nó không thể duy trì được (bạn đã chỉ ra điều đó là bất lợi).
CoderHawk

1
@Sandy Nó thực sự phụ thuộc vào dữ liệu, tần suất thay đổi và nơi khác sẽ được sử dụng. Ví dụ: nếu ràng buộc phải được thi hành bởi DB, nhưng các giá trị cũng có thể được sử dụng để đưa vào menu thả xuống hoặc trong báo cáo, thì khóa ngoại sẽ phù hợp hơn. Dù bằng cách nào, tôi khuyên bạn không nên làm điều đó trong ứng dụng.
Gaius

7

Trực tiếp sử dụng giá trị tra cứu trực tiếp - một chút mâu thuẫn với mục đích thực tế của bảng tra cứu. Tại sao bạn đang giữ một bảng như vậy? Nếu nó không phải là một tra cứu.
Có thể tôi hiểu nhầm câu hỏi của bạn. Đây là một định nghĩa bảng tra cứu từ msd

Bảng tra cứu được sử dụng để hiển thị thông tin từ một bảng dựa trên giá trị của trường khóa ngoài trong bảng khác. Ví dụ, hãy xem xét một bảng Đơn hàng trong cơ sở dữ liệu bán hàng. Mỗi bản ghi trong bảng Đơn hàng bao gồm một ID khách hàng cho biết khách hàng nào đã đặt hàng. ID khách hàng là khóa ngoại được trỏ đến hồ sơ khách hàng trong bảng Khách hàng. Khi trình bày danh sách Đơn hàng (từ bảng Đơn hàng), bạn có thể muốn hiển thị tên khách hàng thực tế, trái ngược với ID khách hàng. Vì tên khách hàng nằm trong bảng khách hàng và bạn đang trình bày dữ liệu từ bảng Đơn hàng, bạn cần tạo bảng tra cứu, lấy giá trị CustomerID trong bản ghi Đơn hàng và sử dụng giá trị đó để điều hướng mối quan hệ và trả lại nhiều hơn có thể đọc được, tên khách hàng.

Bạn có thể làm nổi bật mục đích của bảng tra cứu của bạn? nó được sử dụng để lưu trữ một số dữ liệu tĩnh như sau và những bản ghi này không phải là đầu vào của các bản ghi bảng khác?

Bàn hương vị

Orange  
Pista  
Mango

Nếu ở trên là tình huống của bạn, thì tôi muốn khuyên bạn không nên sử dụng bảng tra cứu; có lẽ mã hóa các giá trị danh sách này trong ứng dụng web của bạn. Bằng cách này bạn có thể tránh truy vấn cơ sở dữ liệu không cần thiết.


1
điểm tốt, mục đích của bảng tra cứu của tôi về cơ bản chỉ là để thực thi các giá trị khác nhau mà một cột có thể có thông qua một ràng buộc khóa ngoài. Tôi đồng ý rằng việc mã hóa nó vào ứng dụng có thể là một cách khác để xử lý việc này.
Jaco Brier

@Jaco Bences - Xem câu trả lời của Gaius ... sử dụng Kiểm tra ràng buộc ...
CoderHawk

7

Vì bạn đủ điều kiện cho câu hỏi của mình với 'cụ thể cho bảng tra cứu,' câu trả lời có thể được đơn giản hóa thành 'tiết kiệm không gian'.

Tôi nghĩ rằng nếu bạn loại bỏ vòng loại đó, câu hỏi của bạn sẽ trở thành 'Tại sao sử dụng khóa thay thế so với khóa tự nhiên?' Tôi đã viết như sau để hỗ trợ các khóa thay thế:

"Di chuyển một giá trị số nguyên thay vì khóa tổng hợp rộng hơn có rất nhiều lợi ích. Nó cung cấp tính nhất quán tốt trên mô hình vật lý, và tiết kiệm không gian nhiều hơn chi phí và giảm I / O khi so sánh với di chuyển các phím ghép; mô hình chuẩn hóa. Ngoài ra, họ đơn giản hóa sự hiểu biết về một mô hình và tham gia truy vấn. "

Đây là phần lớn lý do tại sao nó "trở thành điều tiêu chuẩn để làm." Sản phẩm sinh học không may là mọi người ném vào khóa thay thế và không nghĩ khóa ứng viên là gì ... Nhưng bây giờ chúng tôi đang vượt ra khỏi câu hỏi của bạn :)


3

Một trong những lý do tôi luôn sử dụng là nếu ai đó đã viết sai một giá trị trong bảng tra cứu, hãy nói Oraneg thay vì Orange, việc thay đổi giá trị trong bảng tra cứu là rất dễ dàng.

Bảng tra cứu với khóa chính số sẽ chỉ yêu cầu thay đổi giá trị trong bảng tra cứu.

Bảng tra cứu sử dụng các giá trị làm khóa chính của chúng sẽ cần được thay đổi trong bảng tra cứu và trong mọi bản ghi trong bảng chính nơi nó được sử dụng.


2

Khi bạn xác định ID, bạn cũng có thể đảm bảo tính duy nhất. Nhưng khi bạn lấy, ví dụ như e-mail, với tư cách là định danh duy nhất, bạn chuyển trách nhiệm về tính duy nhất sang bên thứ 3 không đáng tin cậy.

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.