Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Nhiều khóa chính có thể tồn tại trên một bảng không?

  • 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ả emailusername 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_nameyear_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 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)[Third normal form](https://en.wikipedia.org/wiki/Third_normal_form) ).

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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lọc các bản ghi bằng hàm tổng hợp COUNT

  2. Cách tạo đối tượng tập kết quả có thể cuộn, có thể cập nhật trong JDBC

  3. Cách viết các thủ tục được lưu trữ cho các báo cáo SSRS chuyên nghiệp

  4. Mở rộng việc sử dụng DBCC CLONEDATABASE

  5. Xử lý xác nhận email trong khi đăng ký trong Flask