Câu trả lời:
Về mặt kỹ thuật là có, nhưng nếu một chuỗi có ý nghĩa là khóa chính thì có lẽ bạn nên sử dụng nó. Tất cả điều này phụ thuộc vào kích thước của bảng bạn đang tạo và độ dài của chuỗi sẽ là khóa chính (chuỗi dài hơn == khó so sánh hơn). Tôi không nhất thiết phải sử dụng một chuỗi cho một bảng có hàng triệu hàng, nhưng mức độ làm chậm hiệu suất mà bạn sẽ nhận được bằng cách sử dụng một chuỗi trên các bảng nhỏ hơn sẽ gây ra những cơn đau đầu mà bạn có thể có bằng một số nguyên không có 't có nghĩa là bất cứ điều gì liên quan đến dữ liệu.
Một vấn đề khác khi sử dụng Chuỗi làm khóa chính là vì chỉ mục liên tục được sắp xếp theo thứ tự, khi một khóa mới được tạo sẽ ở giữa thứ tự, chỉ mục phải được xác định lại ... nếu bạn sử dụng tự động số nguyên, khóa mới chỉ được thêm vào cuối chỉ mục.
Chèn vào bảng có chỉ mục được nhóm trong đó việc chèn xảy ra ở giữa chuỗi KHÔNG làm cho chỉ mục được viết lại. Nó không làm cho các trang chứa dữ liệu được viết lại. Nếu có chỗ trên trang nơi hàng sẽ đi, thì nó được đặt trong trang đó. Trang đơn sẽ được định dạng lại để đặt hàng vào đúng vị trí trong trang. Khi trang đầy, việc phân chia trang sẽ xảy ra, với một nửa số hàng trên trang sẽ chuyển sang một trang và một nửa sẽ ở trang kia. Các trang sau đó được đưa vào danh sách các trang được liên kết bao gồm dữ liệu bảng có chỉ mục được nhóm. Nhiều nhất, bạn sẽ kết thúc việc viết 2 trang cơ sở dữ liệu.
Các chuỗi chậm hơn trong các phép nối và trong cuộc sống thực, chúng rất hiếm khi thực sự độc đáo (ngay cả khi chúng được cho là). Ưu điểm duy nhất là họ có thể giảm số lượng tham gia nếu bạn tham gia vào bảng chính chỉ để lấy tên. Tuy nhiên, các chuỗi cũng thường có thể thay đổi, do đó tạo ra vấn đề phải sửa tất cả các hồ sơ liên quan khi tên công ty thay đổi hoặc người kết hôn. Đây có thể là một thành công lớn và nếu tất cả các bảng có liên quan bằng cách nào đó không liên quan (điều này xảy ra thường xuyên hơn bạn nghĩ), thì bạn cũng có thể có sự không khớp dữ liệu. Một số nguyên sẽ không bao giờ thay đổi trong suốt vòng đời của bản ghi là sự lựa chọn an toàn hơn nhiều từ quan điểm toàn vẹn dữ liệu cũng như từ quan điểm hiệu suất. Khóa tự nhiên thường không tốt cho việc bảo trì dữ liệu.
Tôi cũng muốn chỉ ra rằng điều tốt nhất của cả hai thế giới thường là sử dụng khóa tự động (hoặc trong một số trường hợp chuyên biệt, GUID) làm PK và sau đó đặt một chỉ mục duy nhất vào khóa tự nhiên. Bạn nhận được các liên kết nhanh hơn, bạn không nhận được các bản ghi trùng lặp và bạn không phải cập nhật một triệu hồ sơ con vì tên công ty đã thay đổi.
Không có vấn đề gì khi bạn sử dụng làm khóa chính miễn là nó ĐỘC ĐÁO. Nếu bạn quan tâm đến tốc độ hoặc thiết kế cơ sở dữ liệu tốt, hãy sử dụng int trừ khi bạn có kế hoạch sao chép dữ liệu, sau đó sử dụng GUID.
Nếu đây là một cơ sở dữ liệu truy cập hoặc một số ứng dụng nhỏ thì ai thực sự quan tâm. Tôi nghĩ lý do tại sao hầu hết các nhà phát triển của chúng tôi tát int hoặc hướng dẫn cũ ở phía trước là vì các dự án có cách phát triển trên chúng tôi và bạn muốn để lại cho mình tùy chọn để phát triển.
Quá nhiều biến số. Nó phụ thuộc vào kích thước của bảng, chỉ mục, tính chất của miền khóa chuỗi ...
Thông thường , số nguyên sẽ nhanh hơn. Nhưng sự khác biệt sẽ đủ lớn để quan tâm? Khó mà nói ra được.
Ngoài ra, động lực của bạn để chọn chuỗi là gì? Các phím tăng tự động số thường cũng dễ dàng hơn rất nhiều . Có phải là ngữ nghĩa? Tiện? Nhân rộng / ngắt kết nối mối quan tâm? Câu trả lời của bạn ở đây có thể giới hạn các lựa chọn của bạn. Điều này cũng mang đến cho bạn một tùy chọn "lai" thứ ba mà bạn đang quên: Hướng dẫn.
Đừng lo lắng về hiệu suất cho đến khi bạn có một thiết kế đơn giản và hợp lý, phù hợp với chủ đề mà dữ liệu mô tả và phù hợp với mục đích sử dụng dữ liệu. Sau đó, nếu vấn đề về hiệu năng xuất hiện, bạn có thể giải quyết chúng bằng cách điều chỉnh hệ thống.
Trong trường hợp này, hầu như luôn luôn tốt hơn khi đi với một chuỗi như một khóa chính tự nhiên, miễn là bạn có thể tin tưởng nó. Đừng lo lắng nếu đó là một chuỗi, miễn là chuỗi đó ngắn một cách hợp lý, hãy nói tối đa khoảng 25 ký tự. Bạn sẽ không phải trả giá đắt về hiệu suất.
Do người nhập dữ liệu hoặc nguồn dữ liệu tự động luôn cung cấp giá trị cho khóa tự nhiên được cho là hoặc đôi khi bị bỏ qua? Có đôi khi sai trong dữ liệu đầu vào? Nếu vậy, lỗi được phát hiện và sửa chữa như thế nào?
Có phải các lập trình viên và người dùng tương tác chỉ định các truy vấn có thể sử dụng khóa tự nhiên để có được những gì họ muốn không?
Nếu bạn không thể tin tưởng vào khóa tự nhiên, hãy phát minh ra một người thay thế. Nếu bạn phát minh ra một đại diện thay thế, bạn cũng có thể phát minh ra một số nguyên. Sau đó, bạn phải lo lắng về việc che giấu người thay thế khỏi cộng đồng người dùng. Một số nhà phát triển đã không che giấu khóa thay thế đã hối tiếc.
Chỉ số ngụ ý rất nhiều so sánh.
Thông thường, các chuỗi dài hơn số nguyên và quy tắc đối chiếu có thể được áp dụng để so sánh, do đó, việc so sánh các chuỗi thường là nhiệm vụ chuyên sâu tính toán hơn so với so sánh các số nguyên.
Tuy nhiên, đôi khi, sử dụng chuỗi làm khóa chính nhanh hơn so với thực hiện nối thêm với string to numerical id
bảng.
Có, nhưng trừ khi bạn mong đợi có hàng triệu hàng, không sử dụng khóa dựa trên chuỗi vì chậm hơn thường là "tối ưu hóa sớm". Xét cho cùng, các chuỗi được lưu trữ dưới dạng số lớn trong khi các khóa số thường được lưu trữ dưới dạng số nhỏ hơn.
Tuy nhiên, một điều cần chú ý là nếu bạn có các chỉ mục cụm trên bất kỳ khóa nào và đang thực hiện một số lượng lớn các phần chèn không tuần tự trong chỉ mục. Mỗi dòng viết sẽ khiến chỉ mục viết lại. nếu bạn đang thực hiện chèn hàng loạt, điều này thực sự có thể làm chậm quá trình.
Hai lý do để sử dụng số nguyên cho các cột PK:
Chúng tôi có thể đặt danh tính cho trường số nguyên tăng tự động.
Khi chúng ta tạo PK, db tạo một chỉ mục (Cluster hoặc Non Cluster) để sắp xếp dữ liệu trước khi nó được lưu trữ trong bảng. Bằng cách sử dụng danh tính trên PK, trình tối ưu hóa không cần kiểm tra thứ tự sắp xếp trước khi lưu bản ghi. Điều này cải thiện hiệu suất trên các bảng lớn.
Lý do của bạn để có một chuỗi là khóa chính là gì?
Tôi sẽ chỉ đặt khóa chính thành trường số nguyên tăng tự động và đặt một chỉ mục trên trường chuỗi.
Theo cách đó, nếu bạn thực hiện tìm kiếm trên bàn thì chúng sẽ tương đối nhanh, và tất cả các phép nối và giao diện bình thường của bạn sẽ không bị ảnh hưởng trong tốc độ của chúng.
Bạn cũng có thể kiểm soát số lượng trường chuỗi được lập chỉ mục. Nói cách khác, bạn có thể nói "chỉ lập chỉ mục 5 ký tự đầu tiên" nếu bạn nghĩ rằng điều đó là đủ. Hoặc nếu dữ liệu của bạn có thể tương đối giống nhau, bạn có thể lập chỉ mục cho toàn bộ trường.
Từ quan điểm hiệu suất - Có chuỗi (PK) sẽ làm chậm hiệu suất khi so sánh với hiệu suất đạt được bằng cách sử dụng số nguyên (PK), trong đó PK ---> Khóa chính.
Từ quan điểm yêu cầu - Mặc dù đây không phải là một phần của câu hỏi của bạn nhưng tôi muốn đề cập. Khi chúng tôi xử lý dữ liệu lớn trên các bảng khác nhau, chúng tôi thường tìm kiếm bộ khóa có thể được đặt cho một bảng cụ thể. Điều này chủ yếu là do có nhiều bảng và chủ yếu là mỗi bảng hoặc một số bảng sẽ liên quan đến nhau thông qua một số quan hệ (một khái niệm về Khóa ngoài). Do đó, chúng tôi thực sự không thể luôn luôn chọn một số nguyên làm Khóa chính, thay vào đó chúng tôi sẽ kết hợp 3, 4 hoặc 5 thuộc tính làm khóa chính cho các bảng đó. Và các khóa đó có thể được sử dụng làm khóa ngoại khi chúng ta liên kết các bản ghi với một số bảng khác. Điều này làm cho nó hữu ích để liên kết các bản ghi trên các bảng khác nhau khi được yêu cầu.
Do đó, đối với việc sử dụng tối ưu - Chúng tôi luôn tạo kết hợp 1 hoặc 2 số nguyên với 1 hoặc 2 thuộc tính chuỗi, nhưng chỉ một lần nữa nếu được yêu cầu.
Có thể có một sự hiểu lầm rất lớn liên quan đến chuỗi trong cơ sở dữ liệu. Hầu như tất cả mọi người đã nghĩ rằng đại diện cơ sở dữ liệu của các số nhỏ gọn hơn so với chuỗi. Họ nghĩ rằng trong các số db được thể hiện như trong bộ nhớ. Nhưng nó không phải là sự thật. Trong hầu hết các trường hợp, biểu diễn số gần với chuỗi A hơn như biểu diễn khác.
Tốc độ sử dụng số hoặc chuỗi phụ thuộc nhiều hơn vào việc lập chỉ mục sau đó loại chính nó.
Theo mặc định, ASPNetUserIds là 128 chuỗi char và hiệu suất chỉ ở mức tốt.
Nếu khóa ĐÃ là duy nhất trong bảng thì nó phải là Khóa. Đây là lý do tại sao;
Khóa chuỗi chính = Mối quan hệ DB chính xác, Khóa 1 chuỗi (Chính) và Chỉ mục 1 chuỗi (Chính).
Các tùy chọn khác là một int chính điển hình, nhưng nếu chuỗi HAS phải là duy nhất, bạn sẽ vẫn có thể cần phải thêm một chỉ số vì các truy vấn không ngừng để xác nhận hoặc kiểm tra xem độc đáo của nó.
Vì vậy, sử dụng khóa nhận dạng int = Mối quan hệ DB không chính xác, 1 khóa int (Chính), 1 chỉ mục int (Chính), Có thể là một chuỗi Chỉ mục duy nhất và phải xác thực thủ công cùng một chuỗi không tồn tại (có thể giống như kiểm tra sql ).
Để có được hiệu suất tốt hơn sử dụng một int qua một chuỗi cho khóa chính, khi chuỗi HAS phải là duy nhất, nó sẽ phải là một tình huống rất kỳ quặc. Tôi luôn thích sử dụng các khóa chuỗi. Và như một quy tắc tốt, đừng bình thường hóa cơ sở dữ liệu cho đến khi bạn CẦN .