Khóa chính VARCHAR - MySQL


8

Hiện tại, tôi có một categoriesbảng có 2 cột - category VARCHAR(50) NOT NULL PRIMARY KEYparent VARCHAR(50). Các parentcột là khóa ngoại (FK) đến categorycột.

Đây dường như là cách tiếp cận rõ ràng nhất. Tuy nhiên, tiếng chuông báo thức đang vang lên trong đầu tôi vì tôi đang sử dụng một VARCHARcột cho khóa chính, điều này có thể làm chậm hoạt động khi truy vấn bảng.

Tôi có thể giới thiệu một cột thứ ba được gọi cat_id INT AUTO_INCREMENTvà đặt đó là PK, nhưng nó sẽ giới thiệu một cột mới không có ý nghĩa.

Ngoài cái nào sẽ nhanh hơn, cần xem xét những gì khác?

NB Tôi dự đoán sẽ có tối đa 1000 danh mục hoặc vì vậy số lượng hàng không quá cao. Tuy nhiên, categoriescột PK sẽ là cột tham chiếu cho nhiều khóa ngoại, trong các bảng khác.

Tôi có nên sử dụng tên người dùng (duy nhất) làm PK không?

Câu trả lời:


8

VARCHAR cột là Khóa chính không phải là một lựa chọn tốt vì thông thường chúng ta tạo Chỉ mục cụm trên cùng một cột.

Chỉ số cụm trên các cột VARCHAR là một lựa chọn tồi vì tỷ lệ phân mảnh cao dự kiến. Mỗi giá trị khóa được chèn mới sẽ cố gắng tìm vị trí của nó ở đâu đó giữa các khóa hiện có và thường gây ra sự phân tách trang và phân mảnh chỉ mục cao. Kết quả là hiệu suất kém và chỉ số bổ sung xây dựng lại / sắp xếp lại chi phí.

Thứ hai, trong khi sử dụng varcharcột khóa làm Khóa ngoài sẽ chiếm thêm dung lượng so với auto-incrementedcột khóa giả .

NHƯNG

Chỉ mục được nhóm trên cột tăng tự động có thể tạo ra "điểm nóng". Đọc kỹ điều này Có phải 'Tránh tạo một chỉ mục được nhóm dựa trên khóa tăng' là một huyền thoại từ SQL Server 2000 ngày?

Mặc dù điểm nóng có thể là một vấn đề, khi nhiều người dùng đang cố gắng chèn giá trị nhưng trong trường hợp của bạn, tôi muốn dùng cột tăng tự động so với varchar.


7

Có, tôi sẽ thêm khóa số nguyên 4 byte thay thế. Hai cột hiện tại của bạn là 100 byte, sau đó có thể giảm xuống còn 58 byte bằng cách thêm cột nhận dạng mới. Bạn thậm chí có thể biến khóa thay thế thành một phần nhỏ 2 byte nếu bạn chắc chắn rằng bạn sẽ không bao giờ vượt quá 65.535 danh mục (có thể vẫn là một ý tưởng hay để lại dưới dạng INT chỉ trong trường hợp).

Tiết kiệm không gian không phải là tuyệt vời cho bảng 1.000 hàng, nhưng đó là nơi cat_id được thêm vào các bảng khác, bạn có thể tiết kiệm không gian đáng kể (4 byte thay vì 50 trong mỗi FK). Bạn cũng có thể muốn lập chỉ mục các khóa ngoại này, vì vậy mức tiết kiệm không gian sẽ còn lớn hơn trong tất cả các chỉ mục không được nhóm của bạn.

Ngoài ra, chỉ mục được nhóm của bạn hiện tuần tự để tránh phân mảnh (chia trang) khi thêm danh mục mới

Cấu trúc bảng: -

create table dbo.Cateogory (
    CateogoryID int not null identity(1,1) constraint pkCateogory primary key clustered,
    Cateogory varchar(50) not null constraint ukCateogory unique nonclustered,
    ParentCateogoryID int null constraint fkCateogory references dbo.Cateogory(CateogoryID)
    )

Bạn cũng có thể thêm các tùy chọn chỉ mục trong sản xuất (fillfactor, v.v.) tùy theo yêu cầu của bạn.

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.