6

Xem xét tình huống này: Xe được mua từ Nhân viên bán hàng. Nhân viên bán hàng hoạt động tại Phòng trưng bày (và chỉ tại một Phòng trưng bày). Phòng trưng bày được liên kết với một Nhà sản xuất và chỉ bán xe do Nhà sản xuất đó sản xuất. Đồng thời, một chiếc xe là một mẫu cụ thể và một Mẫu được sản xuất bởi Nhà sản xuất.Cách giữ quan hệ khóa ngoại nhất quán trong hệ thống quan hệ "hình kim cương" của mối quan hệ

Hạn chế R: Nhà sản xuất của Nhà sản xuất ô tô phải là Nhà sản xuất giống như Nhà sản xuất liên kết của Người bán hàng của Người bán xe.

Biểu đồ hiển thị các mối quan hệ khóa ngoại quan rõ ràng.

 ----> Manufacturer <---- 
    |      | 
    |      | 
Showroom      | 
    ^      | 
    |      Model 
    |      ^
Salesperson     | 
    ^      | 
    |      | 
    --------- Car ---------- 

Làm cách nào để bạn thực thi Hạn chế R? Bạn có thể thêm mối quan hệ khóa ngoài Car --> Manufacturer. Tuy nhiên, Nhà sản xuất của một chiếc xe có thể được thiết lập bằng cách tham gia các bảng một cách này hay cách khác xung quanh "kim cương", vì vậy chắc chắn để làm điều này sẽ không được chuẩn hóa? Tuy nhiên, tôi không biết cách khác để thực thi ràng buộc.

+2

chỉ có thể là ví dụ - nhưng ở đây tôi sẽ không hạn chế vì thực tế là phòng trưng bày được kết hợp với nhà sản xuất, thì tất cả các xe được bán ở đó phải do nhà sản xuất đó tạo ra ... hơn nữa - cùng một nhân viên bán hàng có thể làm việc tại nhiều phòng trưng bày. – Randy

+0

^^ Phòng trưng bày phải làm gì với nhà sản xuất? – Kermit

+0

Tôi đã làm rõ câu hỏi. Một Showroom chỉ bán xe ô tô do Nhà sản xuất sản xuất mà nó được liên kết. – Hammerite

Trả lời

1

Nếu tôi hiểu câu hỏi một cách chính xác, điều này sẽ gần gũi.

enter image description here

Dưới đây là vài chi tiết cho các phím

-- 
-- Keys for SalesPerson 
-- 
alter table SalesPerson 
    add constraint PK_salesperson primary key (PersonID) 

, add constraint AK1_salesperson unique (ManufacturerID, ShowRoomNo, PersonID) 

, add constraint FK1_salesperson foreign key (PersonID) 
          references Person (PersonID) 

, add constraint FK2_salesperson foreign key (ManufacturerID, ShowRoomNo) 
         references ShowRoom (ManufacturerID, ShowRoomNo) 
; 

-- 
-- keys for Sale table 
-- 
alter table Sale 
    add constraint PK_sale primary key (SaleID) 

, add constraint FK1_sale foreign key (BuyerID) 
        references Person (PersonID) 

, add constraint FK2_sale foreign key (ManufacturerID, ModelName, ShowRoomNo) 
       references CarDisplay (ManufacturerID, ModelName, ShowRoomNo) 

, add constraint FK3_sale foreign key (ManufacturerID, ShowRoomNo, SalesPersonID) 
       references SalesPerson (ManufacturerID, ShowRoomNo, PersonID) 
; 
+0

Cảm ơn câu trả lời của bạn. Quan sát chính xuất hiện là việc tạo ra bảng tham khảo chéo CarDisplay, và sự thay đổi của các mối quan hệ khóa ngoại để thích ứng với nó. – Hammerite

+0

@Hammerite, cũng lưu ý khóa thay thế (chỉ mục duy nhất) 'AK' trên SalesPerson, FK từ bảng' Sale' trỏ tới khóa đó. –

4

Cách để đảm bảo rằng đó là "đáy" của kim cương không thể tham chiếu "bên" của kim cương mà cuối cùng dẫn đến một khác nhau " đầu "của kim cương, là sử dụng xác định các mối quan hệ và các khóa tự nhiên" chất béo ", do đó chúng có thể được hợp nhất ở dưới cùng:

enter image description here

(Chỉ hiển thị trường PK, ngắn gọn. Bạn sẽ gần như chắc chắn muốn có một số nhận dạng xe như một chìa khóa thay thế trong Car vv ...)

Các ManufacturerId đã di cư xuống hai bên kim cương và cuối cùng sáp nhập ở phía dưới vào một trường duy nhất. Thực tế là nó là đơn nộp đảm bảo không thể có hai nhà sản xuất dẫn đến cùng một chiếc xe.

BTW, điều này vẫn không ngăn bạn sử dụng các phím thay thế (ngoài những Naturals), giả sử DBMS hỗ trợ FKs để phím thay thế:

enter image description here

Surrogates là dư thừa trong mô hình này được thực hiện một mình , nhưng bạn có thể có một số thực thể khác ở đó mà bạn chưa cho chúng tôi thấy, điều này có thể được hưởng lợi từ việc sử dụng các FK mỏng hơn.


Ở trên là chuyển đổi trực tiếp nhất của sơ đồ, nơi ô tô chỉ tồn tại dưới dạng xe bán.Tuy nhiên, tôi nghi ngờ bạn muốn để có thể lưu trữ những chiếc xe chưa được bán nêu ra, và khi họ bán nhớ người mua xe vv ...

Vì vậy, một mô hình hoàn chỉnh hơn sẽ giống như thế này:

enter image description here

Chúng tôi chỉ rửa-and-lặp lại các mối quan hệ lừa xác định, do đó, một chiếc xe không thể được hiển thị trong một showroom của một nhà sản xuất khác nhau và không thể được bán bởi một nhân viên bán hàng từ một showroom khác nhau.

Ô tô chưa bán khi chỉ có một hàng trong Car. Xe hơi được bán khi có hàng trong số Car hàng tương ứng trong Sale. Cả hai CarSale chia sẻ cùng một PK và đây là mối quan hệ "1 đến 0..1", cũng có thể được mô hình hóa bằng cách hợp nhất CarSale và làm cho trường của bán có thể thực hiện được, với CHECK thích hợp để đảm bảo chúng không thể "một phần NULL".

BTW, bất cứ khi nào bạn bán thứ gì đó, bạn cần đảm bảo bán hàng "bị đóng băng đúng giờ". Ví dụ: giá thực tế mà người mua trả không được thay đổi chỉ vì giá của xe đã thay đổi sau khi bán. Hãy xem here để biết thêm thông tin.