2011-09-05 56 views
6

Xin chào, tôi có một câu hỏi ngắn về thiết kế cơ sở dữ liệu. Tôi cũng đã thử tìm kiếm nhưng không thể tìm thấy những gì tôi đang tìm kiếm. Vì vậy, đây là câu hỏi của tôi:1: N mối quan hệ trong đó N phải có ít nhất một mục

Tôi có hai bảng cơ sở dữ liệu Ý tưởngPhương tiện (1: N). Vì vậy, về cơ bản điều này có nghĩa là một ý tưởng không thể có, một hoặc một số phương tiện truyền thông. NHƯNG tôi tự hỏi bản thân mình nếu có thể xác định bảng mà mỗi ý tưởng phải có ít nhất một phương tiện. Nếu điều này là có thể làm thế nào tôi có thể đạt được điều này với MS SQL Server 2008?

Tôi hy vọng ai đó có thể giúp tôi.

Thx rất nhiều sự giúp đỡ của bạn

UPDATE: đây là những gì nó trông giống như tại thời điểm này:

enter image description here

+2

Tôi không chắc chắn làm thế nào bạn có thể làm điều này với việc giữ 'Media' trong một bảng riêng biệt: làm thế nào bạn sẽ chèn dữ liệu? Trước tiên, bạn phải chèn vào một bảng, sau đó nhập vào bảng thứ hai. Những gì bạn có thể thử làm là đặt 'Media' đầu tiên vào' Idea' (không chuẩn hóa) và khai báo các trường là 'không null' - nhưng tôi sẽ không khuyến khích nó. Bạn có thể tốt hơn với một số logic trong mã chứ không phải là cơ sở dữ liệu. –

+0

Tôi đồng ý với Aleks. Tôi nghĩ rằng đây là một quy tắc kinh doanh thuộc về tầng giữa ở đâu đó, không phải trong cơ sở dữ liệu. – David

+0

@Aleks gắn một FK NOT NULL từ Idea to Media không phải là không phổ biến. Nó đơn giản, và vâng, anh ta sẽ cần phải điền vào Media trước. – vol7ron

Trả lời

2

Đầu tiên, có một quy tắc thiết kế là một mô hình bảng hoặc là một loại thực thể duy nhất hoặc mối quan hệ giữa các loại thực thể nhưng không phải cả hai. Do đó, tôi hình dung ba bảng, Media (thực thể), Idea (thực thể) và IdeasMedia (mối quan hệ). p.s. bạn biết số ít của 'phương tiện' là 'trung bình', đúng không? :)

Dưới đây là một số tiêu chuẩn DDL SQL-92 tập trung vào duy nhất phím:

CREATE TABLE Media (MediaID INTEGER NOT NULL UNIQUE); 
CREATE TABLE Idea (IdeaID INTEGER NOT NULL UNIQUE); 
CREATE TABLE IdeasMedia 
(
MediaID INTEGER NOT NULL REFERENCES Media (MediaID), 
IdeaID INTEGER NOT NULL REFERENCES Idea (IdeaID) 
); 
CREATE ASSERTION Idea_must_have_media DEFERRABLE 
    CHECK (
      NOT EXISTS (
         SELECT * 
         FROM Idea AS i 
         WHERE NOT EXISTS (
             SELECT * 
              FROM IdeasMedia AS im 
              WHERE im.MediaID = i.IdeaID 
             ) 
        ) 
     ); 

Có một 'gà và quả trứng' kịch bản ở đây: không thể tạo ra một ý tưởng với không có tham khảo IdeasMedia nhưng có thể Không tạo ra một IdeasMedia mà không cần tạo một Idea!

Giải pháp lý tưởng (dựa trên cơ sở) sẽ là cho SQL Standard để hỗ trợ nhiều nhiệm vụ, ví dụ:

INSERT INTO Media (MediaID) VALUES (22), 
    INSERT INTO Idea (IdeaID) VALUES (55), 
    INSERT INTO IdeasMedia (MediaID, IdeaID) VALUES (22, 55); 

trong đó dấu chấm phẩy biểu thị ranh giới câu lệnh SQL tại điểm nào được kiểm tra và dấu phẩy biểu thị các câu lệnh phụ.

Đáng buồn thay, không có kế hoạch thêm mô hình dựa trên tập này vào Chuẩn SQL.

SQL-92 (thủ tục) giải pháp này như sau:

BEGIN TRANSACTION; 
INSERT INTO Media (MediaID) VALUES (22); 
SET CONSTRAINTS Idea_must_have_media DEFERRED; 
-- omit the above if the constraint was declared as INITIALLY DEFERRED. 
INSERT INTO Idea (IdeaID) VALUES (55); 
INSERT INTO IdeasMedia (MediaID, IdeaID) VALUES (55, 22); 
SET CONSTRAINTS Idea_must_have_media IMMEDIATE; 
-- above may be omitted: constraints are checked at commit anyhow. 
COMMIT TRANSACTION; 

Đáng buồn thay, SQL Server không hỗ trợ CREATE ASSERTION cũng không CHECK ngại rằng có thể tham khảo các bảng khác cũng không khó khăn deferrable!

Cá nhân, tôi sẽ xử lý này trong SQL Server như sau:

  • Tạo 'helper' lưu trữ procs để thêm, sửa đổi và loại bỏ Ideas và tương ứng của họ IdeasMedia mối quan hệ.
  • Xóa đặc quyền cập nhật khỏi các bảng để buộc người dùng sử dụng các procs .
  • Có thể sử dụng trình kích hoạt để xử lý các trường hợp khi xóa các đối tượng MediaIdea.

Chắc chắn, điều này (một lần nữa thủ tục) thực hiện được xa rời phương pháp lý tưởng thiết lập dựa trên, mà có lẽ giải thích lý do tại sao hầu hết các lập trình SQL nhắm mắt làm ngơ để một yêu cầu cho một 1: mối quan hệ 1..N và thay vào đó giả sử nhà thiết kế có nghĩa là 1: 0..N !!

+0

Hey onedaywhen cảm ơn câu trả lời thực sự tuyệt vời của bạn !!! Câu trả lời của bạn rất rộng và mô tả các cách tiếp cận khác nhau để đạt được giải pháp cho vấn đề của tôi. Tôi thực sự đánh giá cao điều đó. Mặc dù vậy mọi giải pháp đều khá xấu xí. Tôi đã quyết định xử lý điều này trong logic kinh doanh của mình. Và thx để chỉnh sửa ngữ pháp;) – MUG4N

1

Bạn tạo một (khoá ngoại) FK trong Idea để PK (khóa chính) trong Phương tiện. Đồng thời áp dụng hạn chế NOT NULL cho FK.

Nếu bạn đã có dữ liệu trong bảng, see here


Để minh họa:

Media    Idea 
-----    ---- 
id | type   id | description  | media_id 
----+-----   ----+-------------------+---------- 
1 | TV    90 | advertise  | 2 
2 | Magazine  90 | advertise  | 1 
3 | Mail   91 | superbowl party | 1 
        91 | superbowl party | 3 

Tôi không nói rằng đây là thiết kế tuyệt vời, và tôi chắc chắn không biết những gì bạn các bảng đang lưu trữ (được chỉ ra bởi ví dụ kém), nhưng ý tưởng không thể tồn tại với mục nhập Media để liên kết đến. Không có liên kết qua lại, bạn đang yêu cầu 1: N, không phải N: N, mà bạn có thể muốn.

Khi suy nghĩ về tên bảng, có vẻ như ý tưởng của bạn là ngược. Tôi nghĩ bạn sẽ có 1: Media to N: Ý tưởng thay vì cách khác.


CREATE TABLE idea (
    id  integer 
    , media_id integer NOT NULL REFERENCES media 
) 

--or-- 

CREATE TABLE idea (
    id   integer 
    , media_id NOT NULL 
    , FOREIGN KEY (media_id) REFERENCES media 
); 

Lưu ý: Đây không phải là bình thường, vì vậy bạn sẽ cần một bảng thứ ba để phù hợp với tham gia.

+1

Vì vậy, hai bảng có chìa khóa nước ngoài với nhau? Đó sẽ là loại kỳ quặc phải không? Và nó cũng bị vấn đề 'gà và trứng' do Aleks G. chỉ định – David

+0

Điều này có nghĩa là tham chiếu chéo ... Tôi đã nghe những điều xấu về tham chiếu chéo. Đây có phải là phương pháp hay nhất phổ biến không? Hoặc có một số thực tiễn tốt nhất cho tình huống này? – MUG4N

+0

@David ý của bạn là gì, tại sao bạn lại có FK với nhau, chỉ có một cách FK từ Idea đến Media – vol7ron

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