2013-02-03 62 views
21

Tôi đang sử dụng Microsoft SQL Server Management Studio và trong khi tạo bảng giao diện, tôi nên tạo cột ID cho bảng nối, nếu vậy tôi cũng nên làm cho nó khóa chính và cột nhận dạng? Hoặc chỉ cần giữ 2 cột cho các bảng tôi đang tham gia vào quan hệ nhiều-nhiều?MS SQL tạo mối quan hệ nhiều-nhiều với bảng nối

Ví dụ, nếu đây sẽ là nhiều đến nhiều bảng:

MOVIE 
Movie_ID 
Name 
etc... 

CATEGORY 
Category_ID 
Name 
etc... 

Tôi có nên làm cho bảng đường giao nhau:

MOVIE_CATEGORY_JUNCTION 
Movie_ID 
Category_ID 
Movie_Category_Junction_ID 

[và làm cho Movie_Category_Junction_ID Primary Key của tôi và sử dụng nó như Cột nhận dạng]?

Hoặc:

MOVIE_CATEGORY_JUNCTION 
Movie_ID 
Category_ID 

[và chỉ để nó ở đó không có khóa chính hoặc bảng tính]?

Trả lời

40

Tôi sẽ sử dụng bảng ngã ba thứ hai:

MOVIE_CATEGORY_JUNCTION 
Movie_ID 
Category_ID 

Các khóa chính sẽ là sự kết hợp của cả hai cột. Bạn cũng sẽ có khóa ngoài từ mỗi cột tới bảng MovieCategory.

Bảng ngã ba sẽ trông tương tự như sau:

create table movie_category_junction 
(
    movie_id int, 
    category_id int, 
    CONSTRAINT movie_cat_pk PRIMARY KEY (movie_id, category_id), 
    CONSTRAINT FK_movie 
     FOREIGN KEY (movie_id) REFERENCES movie (movie_id), 
    CONSTRAINT FK_category 
     FOREIGN KEY (category_id) REFERENCES category (category_id) 
); 

Xem SQL Fiddle with Demo.

Sử dụng hai trường này làm PRIMARY KEY sẽ ngăn các kết hợp phim/danh mục trùng lặp được thêm vào bảng.

+1

Tôi cũng làm như vậy. Thêm cột thứ ba có thể có bản ghi trùng lặp. –

+0

là cần thiết để tạo khóa chính kết hợp trong trường hợp này? –

+0

@ Harry.Naeem Nếu không, bạn có thể dễ dàng kết thúc với các bản ghi trùng lặp trong bảng. Tôi sẽ không nghĩ rằng bạn muốn điều đó. – Taryn

16

Có nhiều trường phái khác nhau về điều này. Một trường thích bao gồm khóa chính và đặt tên cho bảng liên kết có ý nghĩa quan trọng hơn hai bảng mà nó đang liên kết. Lý do là mặc dù bảng có thể bắt đầu có vẻ giống như một bảng liên kết, nó có thể trở thành bảng riêng của nó với dữ liệu quan trọng.

Ví dụ là số nhiều giữa nhiều tạp chí và người đăng ký. Liên kết thực sự là đăng ký với các thuộc tính riêng của nó, như ngày hết hạn, trạng thái thanh toán, v.v.

Tuy nhiên, đôi khi tôi chỉ là bảng liên kết chỉ là một bảng liên kết. Mối quan hệ nhiều với nhiều loại là một ví dụ điển hình về điều này.

Vì vậy, trong trường hợp này, không cần thiết phải có khóa chính một trường riêng biệt. Bạn có thể có một phím tự động gán, mà sẽ không làm tổn thương bất cứ điều gì, và sẽ làm cho xóa hồ sơ cụ thể dễ dàng hơn. Nó có thể là tốt như một thực hành chung, vì vậy nếu bảng sau đó phát triển thành một bảng quan trọng với dữ liệu quan trọng của nó (như đăng ký) nó sẽ có một khóa tự động gán chính.

Bạn có thể đặt chỉ mục duy nhất trên hai trường để tránh trùng lặp. Điều này thậm chí sẽ ngăn chặn các bản sao nếu bạn có khóa tự động gán riêng. Bạn có thể sử dụng cả hai trường làm khóa chính của bạn (cũng là một chỉ mục duy nhất).

Vì vậy, một trường phái tư tưởng có thể gắn với số nguyên tự động gán khóa chính và tránh các khóa chính ghép. Đây không phải là cách duy nhất để làm điều đó, và có lẽ không phải là tốt nhất, nhưng nó sẽ không dẫn bạn sai, vào một vấn đề mà bạn thực sự hối tiếc.

Nhưng, đối với một cái gì đó giống như những gì bạn đang làm, có thể bạn sẽ ổn với chỉ hai trường. Tôi vẫn khuyên bạn nên làm cho hai trường trở thành khóa chính kết hợp hoặc ít nhất là đặt một chỉ mục duy nhất trên hai trường.

0

Tôi sẽ đi với bảng nối thứ hai. Nhưng làm cho hai trường đó thành khóa chính. Điều đó sẽ hạn chế các mục trùng lặp.

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