2013-09-26 46 views
5

Công ty của tôi hiện đang trong quá trình viết lại một ứng dụng mà chúng tôi đã mua gần đây. Chúng tôi đã chọn sử dụng ASP.net mvc4 để xây dựng hệ thống này cũng như sử dụng Khuôn khổ thực thể làm ORM của chúng tôi. Chủ sở hữu trước đây của công ty chúng tôi có được là rất kiên quyết rằng chúng tôi sử dụng cơ sở dữ liệu cũ và không thay đổi bất cứ điều gì về nó để khách hàng có thể sử dụng sản phẩm của chúng tôi đồng thời với hệ thống cũ trong khi chúng tôi đang phát triển các mô-đun khác nhau.Sự khác biệt giữa khóa chính và chỉ mục duy nhất trong SQL Server

Tôi phát hiện ra rằng các cấu trúc bảng cũ không có khóa chính, thay vào đó, nó sử dụng một chỉ mục duy nhất để phục vụ như là khóa chính của chúng. Bây giờ khi sử dụng khung Entity, tôi đã cố gắng kết hợp các bảng của chúng trong cấu trúc nhưng không thể làm như vậy khi EF tạo ra một khóa chính thay vì một chỉ mục duy nhất.

Khi tôi liên hệ với chủ sở hữu trước đó và giải thích, anh ấy nói với tôi rằng "Khóa duy nhất trong mỗi bảng là Khóa chính. Chúng là từ đồng nghĩa với nhau".

Tôi vẫn còn tương đối mới đối với các hệ thống cơ sở dữ liệu nên tôi không chắc liệu điều này có đúng không. Bất cứ ai có thể làm rõ điều này?

bảng của mình khi đổ vào SQL tạo:

-- ---------------------------- 
-- Indexes structure for table AT_APSRANCD 
-- ---------------------------- 
CREATE UNIQUE INDEX [ac_key] ON [dbo].[AT_APSRANCD] 
([AC_Analysis_category] ASC, [AC_ANALYSI_CODE] ASC) 
WITH (IGNORE_DUP_KEY = ON) 
GO 

tuy nhiên hệ thống của tôi tạo ra:

-- ---------------------------- 
-- Primary Key structure for table AT_APSRANCD 
-- ---------------------------- 
ALTER TABLE [dbo].[AT_APSRANCD] ADD PRIMARY KEY ([AC_Analysis_category]) 
GO 

EDIT: Theo dõi câu hỏi này là thế nào tôi sẽ đi về thiết kế các mô hình cho điều này? Tôi chỉ được sử dụng để sử dụng chú thích [Key] xác định nó như là một khóa chính, và không có nó, EF sẽ không tạo ra bảng đó. nên một cái gì đó như thế này:

[Table("AT_APSRANCD")] 
public class Analysis 
{ 
    [Key] 
    public string AnalysisCode { get; set; } 
    public string AnalysisCategory { get; set; } 
    public string ShortName { get; set; } 
    public string LongName { get; set; } 
} 
+0

Kiểm tra câu trả lời của tôi cho khóa tổng hợp ví dụ trong EF. – paqogomez

+0

Lưu ý sự khác biệt bổ sung: ban đầu là hơn hai cột, và ban đầu bỏ qua các giá trị trùng lặp. –

+1

Nếu DB đã tồn tại, tại sao bạn không để EF tạo ra tất cả các thực thể của bạn? – RobH

Trả lời

5

Từ SQL UNIQUE Constraint

Ràng buộc UNIQUE xác định duy nhất mỗi bản ghi trong cơ sở dữ liệu bảng.

Ràng buộc KEY UNIQUE và PRIMARY cả hai cung cấp bảo đảm cho tính duy nhất cho một cột hoặc tập hợp các cột.

PRIMARY Ràng buộc khóa tự động có ràng buộc UNIQUE được xác định trên đó.

Lưu ý rằng bạn có thể có nhiều ràng buộc UNIQUE trên mỗi bảng, nhưng chỉ có một giới hạn KEY PRIMARY KEY cho mỗi bảng.

Ngoài ra, từ Create Unique Indexes

Bạn không thể tạo một chỉ số duy nhất trên một cột duy nhất nếu đó cột chứa NULL trong hơn một hàng. Tương tự, bạn không thể tạo chỉ mục duy nhất trên một số cột nếu kết hợp các cột chứa NULL trong nhiều hàng. Chúng được coi là trùng lặp giá trị cho mục đích lập chỉ mục.

Trong khi từ Create Primary Keys

Tất cả các cột được xác định trong một giới hạn PRIMARY KEY phải được định nghĩa là NOT NULL. Nếu không xác định được tính vô hiệu, tất cả các cột tham gia trong một ràng buộc PRIMARY KEY có khả năng vô hiệu của chúng được đặt là NOT NULL.

+0

Vì vậy, làm thế nào để tôi đi về thiết kế các mô hình cho nó, tôi sử dụng chú thích và cho đến nay chỉ sử dụng [Key] để xác định khóa chính, Nếu tôi không làm tôi có thể làm gì khác? – ChaoticLoki

2

Vâng, chúng rất giống nhau nhưng đây là sự khác biệt.

Chỉ cho phép một khóa chính trên bảng nhưng nhiều chỉ mục duy nhất có thể được thêm tối đa số chỉ mục được phép cho bảng (SQL Server = 250 (1 x clustered, 249 x non clustered) và SQL 2008 và SQL 2012 = 1000 (1 x phân nhóm, 999 x không được nhóm)). Các khóa chính không được chứa các cột có thể rỗng nhưng các chỉ mục duy nhất có thể. Lưu ý rằng chỉ có một NULL được cho phép. Nếu chỉ mục được tạo trên nhiều cột, thì mỗi kết hợp giá trị và NULL phải là duy nhất.

Theo mặc định, trừ khi bạn chỉ định khác trong câu lệnh tạo và cung cấp chỉ mục nhóm không tồn tại, khóa chính được tạo dưới dạng chỉ mục nhóm. Tuy nhiên, chỉ mục duy nhất được tạo theo mặc định dưới dạng chỉ mục không được nhóm trừ khi bạn chỉ định khác và cung cấp chỉ mục nhóm không tồn tại.

liên kết sau thực sự sẽ giúp you.just đi với nó

HERE

1

Vâng, một chìa khóa composite và độc đáo, như bạn có ở đây, sẽ cung cấp cho bạn một chỉ số rất giống với khóa chính. Một trong những ưu điểm này là dữ liệu được chứa trong chỉ mục, vì vậy nó không cần phải tra cứu trong bảng nếu bạn chỉ truy vấn các trường trong khóa.

Điều này cũng có thể trong Khung thực thể. Nó sẽ giống như thế này

public class AT_APSRANCD 
{ 
    [Column(Order = 0), Key, ForeignKey("AC_Analysis_category")] 
    public int AC_Analysis_category{ get; set; } 

    [Column(Order = 1), Key, ForeignKey("AC_ANALYSI_CODE")] 
    public int AC_ANALYSI_CODE{ get; set; } 
} 
+0

Điều đó không chỉ tạo ra một khóa chính composite? – ChaoticLoki

3

Chúng chắc chắn không giống nhau.

Khóa chính phải là duy nhất, nhưng đó chỉ là một trong các yêu cầu của nó. Một số khác sẽ là nó không thể là rỗng, không bắt buộc phải có một ràng buộc duy nhất.

Ngoài ra, theo một cách nào đó, các ràng buộc duy nhất có thể được sử dụng làm khóa chính của người nghèo, sử dụng chúng với IGNORE_DUP_KEY = ON rõ ràng là sai. Cài đặt đó có nghĩa là nếu bạn cố gắng chèn một bản sao, chèn sẽ không âm thầm.

0

khóa chính không chứa bất kỳ giá trị null nào.

nhưng trong trường hợp giá trị null duy nhất có thể chèn vào bảng.

bất kỳ số lượng giá trị null có thể được chèn

định nghĩa của chính chủ chốt primary_key = UNIQUE + NOT_NULL

+0

Xin lỗi, nhưng điều này còn phức tạp hơn thế. – Szymon

4

Họ chắc chắn khác nhau.Như đã đề cập trong câu trả lời khác:

  • chìa khóa độc đáo được sử dụng chỉ để kiểm tra tính độc đáo và không có gì khác
  • tiểu hành chính như một định danh của hồ sơ.

Ngoài ra, điều quan trọng là khóa chính thường là chỉ mục nhóm. Điều này có nghĩa là các bản ghi được lưu trữ vật lý theo thứ tự được xác định bởi khóa chính. Điều này có một hậu quả lớn cho hiệu suất.

Ngoài ra, khóa chỉ mục nhóm (thường là khóa chính) được tự động bao gồm trong tất cả các chỉ mục khác, vì vậy việc nhận nó không yêu cầu tra cứu bản ghi, chỉ cần đọc chỉ mục là đủ.

Để tổng hợp, luôn đảm bảo bạn có khóa chính trên bảng của mình. Các chỉ mục có tác động rất lớn đến hiệu suất và bạn muốn đảm bảo bạn nhận được các chỉ mục của mình ngay.

+1

Điều này không hoàn toàn chính xác. Đó là Khóa chỉ mục nhóm được sử dụng trong tất cả các chỉ mục khác không được nhóm. Thông thường, chỉ số nhóm cũng là PK, nhưng điều đó không phải là trường hợp luôn luôn. –

+0

@SilasHansen Đúng vậy. Tôi cập nhật câu trả lời của tôi, cảm ơn bạn. – Szymon

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