2011-08-28 21 views
9

Tôi đang phân tích một thiết kế cơ sở dữ liệu Oracle và tôi lúng túng khi nhìn thấy cả khóa duy nhất và khóa chính trên cùng các trường. Các cặp khoá chính duy nhất này được tạo liên tục trên tất cả các bảng. Tôi thấy không có lý do để làm điều này.Có lý do nào để sử dụng cả khóa chính và khóa duy nhất cùng nhau trên cùng một trường không?

Nếu tôi vẫn còn khóa chính, có lý do chính đáng để tạo thêm một khóa duy nhất trên cùng một trường không?

+1

Khóa chính theo định nghĩa duy nhất nên tôi không thể thấy bất kỳ lý do nào để thêm một ràng buộc/chỉ mục duy nhất khác – Phil

Trả lời

1

Không, không có lý do gì để có nó cũng là duy nhất; khi bạn đặt cột là PK, bạn chắc chắn rằng:

  1. Không có NULL nào được chấp nhận cho cột đó trên INSERT hoặc UPDATE;
  2. Giá trị trong toàn bộ bảng cho cột đó luôn là UNIQUE;

vì vậy chỉ cần PK là đủ. Vì có một chỉ số UNIQUE cho cột PK, theo định nghĩa, không cần thêm bất kỳ chỉ mục nào khác vào cột đó chỉ vì các truy vấn sẽ sử dụng chỉ mục PK bất cứ khi nào chỉ có cột đó bị ảnh hưởng.

1

Tôi tin rằng đó là bất khả thi (PK và hạn chế duy nhất trên cùng một cột [s]) ...

Bạn không thể chỉ định cùng một cột hoặc kết hợp các cột như cả một khóa chính và một khóa duy nhất.

(từ here, phần "Hạn chế ràng buộc khoá chính"). Phải không?

1

Oracle sẽ không cho phép bạn tạo nhiều ràng buộc UNIQUEPRIMARY KEY trên cùng một trường được đặt theo cùng một thứ tự và sẽ không thành công với ORA-02261.

Nếu bạn có khóa tổng hợp, bạn có thể tạo PRIMARY KEY trên cột được đặt theo một thứ tự (PRIMARY KEY (a, b)) và một ràng buộc duy nhất trên một đơn đặt hàng khác (UNIQUE (b, a)).

Điều này sẽ phân tích cú pháp và thực thi, tuy nhiên một chỉ mục duy nhất sẽ được sử dụng để cảnh sát cả hai ràng buộc để nó không có ý nghĩa.

Bạn có thể vui lòng đăng các kịch bản bảng không?

1

Chỉ cần một chút nền lý thuyết ở đây ... Khi lập mô hình bảng của bạn, bạn xác định một tập hợp các phím . Các phím này tương đương về mặt logic, nhưng với mục đích thực tế bạn chọn một trong số chúng và gọi nó là "chính" trong khi phần còn lại của chúng trở thành "thay thế".

(Trong DDL SQL, một khóa chính được gọi là "PRIMARY KEY", trong khi "chìa khóa thay thế" được gọi là "hạn chế UNIQUE".)

Vì vậy, trong bối cảnh đó, câu hỏi của bạn là tương đương với : "có lý do chính đáng để có hai khóa giống nhau" và câu trả lời là: "không".

đó đang được nói, bạn có thể có phím chồng chéo (tức là phím mà chia sẻ một số lĩnh vực nhưng không phải tất cả), nhưng điều này thường là một dấu hiệu của một thiết kế xấu ... và câu trả lời là: "có lẽ không phải là".


OTOH, nếu bằng cách "khóa duy nhất", bạn thực sự có nghĩa là "độc đáo index", sau đó có, bạn cần cả hai.

Chỉ mục không phải là một ràng buộc hợp lý - chỉ có để cho phép một ràng buộc logic như PRIMARY KEY để thực hiện tốt (và để truy vấn, nhưng đó là một chủ đề khác).

4

Đối với một bảng giải quyết một nhiều đến rất nhiều người ta thường có khóa hai phần (như được chỉ ra bởi Quassnoi). Nó cũng khá có khả năng cần các chỉ mục hỗ trợ truy cập thông qua một trong hai phụ huynh.

Nếu bạn có, ví dụ như bảng PERSON, ADDRESS và PERSON_ADDRESS, bảng PERSON_ADDRESS của bạn có thể có khóa chính là (PERSON_ID, ADDRESS_ID) và chỉ mục hỗ trợ. Bạn cũng sẽ có một chỉ mục khác trên (ADDRESS_ID, PERSON_ID), và bạn có khả năng sẽ làm cho nó trở thành một chỉ số UNIQUE (vì nó là một sự kết hợp độc đáo của các trường). Cũng có thể là DBA của bạn có một số cách cụ thể để tạo ra các bảng bắt đầu với một chỉ mục UNIQUE trên các trường khóa chính, tiếp theo là việc tạo ra ràng buộc PRIMARY KEY. Điều đó có thể hiển thị trong một số công cụ GUI theo cách bạn đề xuất.

Các vấn đề liên quan