- Chìa khóa là gì?
- Các phím đơn giản
- Các phím được kết hợp hoặc ghép lại
- Các Khóa Chính
- Số lượng và Tự động tăng dần
- Một Bảng có thể Chứa Nhiều Khóa Chính không?
Mặc dù nhiều nhà phát triển và quản trị viên cơ sở dữ liệu có thể làm việc với primary keys
hàng ngày, việc tự hỏi bản thân là một chủ đề hấp dẫn, “Chính xác thì là gì một primary keys
và có thể (hoặc nên) một bảng cơ sở dữ liệu chứa nhiều primary keys
đồng thời? ”
Dưới đây, chúng tôi sẽ xem xét chi tiết hơn những câu hỏi này và cố gắng đi đến sự đồng thuận hợp lý và được thống nhất chung trong cộng đồng phát triển.
Phím là gì?
Để hiểu primary keys
là gì nằm trong bảng cơ sở dữ liệu, trước tiên chúng ta phải hiểu một chút về non-primary keys
. Một khóa key
trong một bảng chỉ đơn giản là một thuộc tính được sử dụng để xác định và truy cập thông tin đó. Một bảng có thể và thường sẽ có nhiều khóa, chẳng hạn như trong bảng Users
cả email
và username
có thể được coi là chìa khóa.
Tùy thuộc vào nhà phát triển hoặc quản trị viên mà bạn đang nói chuyện, bạn có thể nghe về nhiều loại khóa và định nghĩa của chúng, vì vậy chúng tôi sẽ chỉ đề cập đến một vài ví dụ khác nhau bên dưới và định nghĩa cơ bản của mỗi loại.
Phím Đơn giản
Một simple key
chỉ là một khóa chỉ sử dụng một thuộc tính duy nhất trong bảng. Trừ khi chúng tôi áp đặt nhiều hạn chế hơn đối với khóa hoặc bảng, thì username
thuộc tính trong ví dụ trên là một simple key
.
Các khóa kết hợp hoặc kết hợp
Tiến thêm một bước từ simple keys
concatenated
hoặc compound
chìa khóa. Như tên của nó, một concatenated key
là sự kết hợp của nhiều single keys
. Ví dụ:hệ thống có thể tự động kết hợp last_name
và year_of_birth
single keys
thành một concatenated key
, như vậy:smith1980
.
Khóa chính
[primary key](https://en.wikipedia.org/wiki/Unique_key)
là khóa đã được chọn làm khóa chính (hoặc chính ) thuộc tính đại diện cho hàng dữ liệu đó. primary keys
là duy nhất và thuộc tính đó sau đó được sử dụng trong toàn bộ cơ sở dữ liệu và được truy cập và chuyển đến các bảng khác như thuộc tính đại diện cho dữ liệu được đề cập.
Trên thực tế, primary keys
thuộc tính cũng được đánh dấu là NOT NULL
trong hầu hết các cơ sở dữ liệu, nghĩa là thuộc tính đó phải luôn chứa một giá trị để bản ghi được chèn vào bảng.
Ví dụ:email
hoặc username
simple keys
có thể được gán ký hiệu của primary keys
, nhưng thông thường, cách tốt nhất là đặt primary keys
đối với một thuộc tính không (hoặc không thể) được thay đổi bởi lôgic kinh doanh hoặc thậm chí bởi cá nhân. Ví dụ:hãy tưởng tượng một User
nhận một địa chỉ email mới, sau đó tạo ra tất cả primary keys
trong quá khứ các liên kết được tạo bằng địa chỉ email cũ trở nên không hợp lệ khi sử dụng địa chỉ email mới.
Vì lý do này (trong số những lý do khác), hầu hết primary keys
sử dụng một số hoặc chuỗi duy nhất, chẳng hạn như [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)
.
Số lượng và Tự động tăng
Cũng cần lưu ý một cách ngắn gọn rằng nhiều hệ thống cơ sở dữ liệu được thiết lập theo cách mà mọi bảng đều có primary keys
đó là cả số và cũng được tăng tự động. Điều này đơn giản có nghĩa là bản thân công cụ cơ sở dữ liệu sẽ tự động gán cho mỗi bản ghi mới trong bảng đó một primary keys
duy nhất giá trị lớn hơn tăng dần so với tất cả các giá trị trước đó. Tuy nhiên, hầu hết các nhà phát triển đồng ý rằng phương pháp này đã lỗi thời và để lộ các lỗi bảo mật không cần thiết cho hệ thống khi được sử dụng cho một số bảng đại diện cho một số dữ liệu nhất định.
Ví dụ:hãy tưởng tượng tất cả User
các bản ghi được gán một khóa chính primary key
giá trị, được gọi là id
thuộc tính. Nếu một kẻ độc hại phát hiện ra rằng id
thuộc tính của một người dùng nhất định (ví dụ:John Smith) là giá trị 1500
, điều này đã tiết lộ một chút thông tin rồi. Đầu tiên, nó chỉ ra rằng có thể có ít nhất 1499 người dùng khác trong hệ thống hoặc tại một thời điểm nào đó. Điều đó cũng có nghĩa là nếu trang người dùng của John Smith có thể được truy cập thông qua URL hoặc lệnh gọi API có chứa id
đó giá trị của 1500
, thì có một cơ hội tốt chỉ cần thay đổi giá trị thành một số khác, chẳng hạn như 1499
hoặc 1501
, sẽ hiển thị trang của người dùng khác có thể không muốn trang của họ được truy cập bởi khách này. Theo cách này, các bản ghi có thể được truy vấn đơn giản bằng cách đoán id
các giá trị trên quy mô khối lượng.
Đây rõ ràng là những ví dụ rất đơn giản, nhưng vì những lý do này, hầu hết các cơ sở dữ liệu hiện đại sẽ sử dụng primary keys
ngẫu nhiên và duy nhất giá trị thuộc tính chẳng hạn như UUID
khi làm việc với dữ liệu nhạy cảm.
Bảng có thể chứa nhiều khóa chính không?
Câu trả lời ngắn gọn là không , một bảng không được phép chứa nhiều primary keys
, vì điều đó đi ngược lại các nguyên tắc cơ bản của thiết kế cơ sở dữ liệu quan hệ (xem:[database normalisation](https://en.wikipedia.org/wiki/Database_normalisation)
và [Third normal form](https://en.wikipedia.org/wiki/Third_normal_form)
).
Nó là có thể để một bảng có nhiều candidate keys
, hoạt động hiệu quả tương tự như primary keys
trong đó một candidate keys
là duy nhất, NOT NULL
, và là một đại diện số ít của bản ghi bảng đó.
Tuy nhiên, khi nói đến việc chọn cái nào thuộc tính sẽ được chỉ định làm primary keys
đối với bảng, lựa chọn đến từ danh sách tất cả các candidate keys
tiềm năng (do đó có tên, chúng là ứng cử viên để trở thành primary keys
). Cuối cùng, chỉ có một candidate keys
được chọn làm thuộc tính đại diện tốt nhất cho bản ghi đó, sẽ được sử dụng trong bảng này làm primary keys
và được các bảng khác tham chiếu ở những nơi khác trong cơ sở dữ liệu thông qua foreign keys
tương ứng của chúng .