6

Rozważmy sytuację: a Samochód jest kupowany od Sprzedawcy. Sprzedawca pracuje w Showroomie (i tylko w jednym Salonie). Showroom jest powiązany z Producentem i sprzedaje wyłącznie samochody wyprodukowane przez tego producenta. W tym samym czasie samochód ma określony model Model, a model jest wytwarzany przez producenta.Sposób utrzymywania stałych relacji z zagranicą w systemie relacji "w kształcie rombu"

Ograniczenie R: Producent modelu samochodu musi być tym samym Producentem, co producent powiązany z Salonem Sprzedawcy Samochodu.

Schemat przedstawia oczywiste relacje klucza obcego.

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

Jak egzekwować ograniczenie R? Możesz dodać relację klucza obcego: Car --> Manufacturer. Jednak Producent Samochodu można ustalić, łącząc stoły w taki czy inny sposób wokół "diamentu", więc na pewno to nie byłoby znormalizowane? A jednak nie wiem inaczej, jak wyegzekwować przymus.

+2

to może być tylko przykład - ale tutaj nie ograniczę tego ze względu na fakt, że salon jest powiązany z producentem, wtedy wszystkie sprzedawane tam samochody muszą być wykonane przez tego producenta ... dalej - ten sam sprzedawca może pracować w wielu salonach. – Randy

+0

^^ Co showroom ma wspólnego z producentem? – Kermit

+0

Ja wyjaśniłem pytanie. Showroom sprzedaje wyłącznie samochody wyprodukowane przez producenta, z którym jest powiązane. – Hammerite

Odpowiedz

1

Jeśli dobrze zrozumiałem pytanie, powinno być blisko.

enter image description here

Oto kilka szczegółów dla kluczy

-- 
-- 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

Dziękuję za odpowiedź. Kluczową obserwacją wydaje się być stworzenie tabeli porównawczej CarDisplay oraz zmiana relacji klucza obcego w celu jej dostosowania. – Hammerite

+0

@Hammerite, również zwrócić uwagę na klucz alternatywny (unikalny indeks) 'AK' na SalesPerson, FK z tabeli' Sale' wskazuje na ten klucz. –

4

drodze do zapewnienia, że ​​„z dołu” diamentu nie można odwołać „boki” z diamentu, które ostatecznie prowadzą do różnych " top”diamentu, jest użycie określających relacje i wynikające«»kluczy naturalnych tłuszczów, dzięki czemu mogą one być połączyła u dołu:

enter image description here

(Pokazano tylko pola PK, dla zwięzłości. prawie na pewno będziemy chcieli numer identyfikacyjny pojazdu jako klucz alternatywnej w Car etc ...)

ManufacturerId zostało przeniesione w dół po obu stronach diamentowych i ostatecznie połączyły się na dole w jednej dziedzinie. Już sam fakt, że jest to jedno wypełnienie zapewnia, że ​​nie może być dwóch producentów prowadzących do tego samego samochodu.

BTW, to nadal nie przeszkadza w używaniu klawiszy zastępczych (oprócz tych Naturals), przy założeniu DBMS obsługuje FKS na przemian klawiszy:

enter image description here

Surogaci są zbędne w tym modelu podjętej sam , ale możesz mieć tam inne przedmioty, których nam nie pokazałeś, a które mogą skorzystać z używania szczuplejszych FK.


Powyższe jest najbardziej bezpośrednią konwersją twojego diagramu, gdzie samochód istnieje tylko jako sprzedany samochód.Podejrzewam jednak, że chciałbyś móc przechowywać samochody, które nie zostały jeszcze sprzedane, a kiedy sprzedane, zapamiętaj nabywcę samochodu itp. ...

Tak więc bardziej kompletny model będzie wyglądać jak to:

enter image description here

po prostu opłukać i-powtórzyć identyfikujące relacji sztuczkę, więc samochód nie może być wyświetlany w salonie innego producenta i nie może być sprzedawany przez sprzedawcę z innego salonu.

Samochód jest niesprzedany, gdy w wierszu znajduje się tylko wiersz Car. Samochód jest sprzedawany, gdy w wierszu Cari znajduje się odpowiedni wiersz w Sale. Zarówno Car, jak i i Sale mają ten sam PK i jest to relacja "1 do 0. 1", która może być również modelowana przez scalenie Car i Sale i sprawienie, aby pola sprzedaży były NULL w stanie, z odpowiednią kontrolą, aby upewnić się, że nie mogą być "częściowo NULL".

BTW, gdy sprzedajesz coś, musisz upewnić się, że sprzedaż jest "zamrożona w czasie". Na przykład cena faktycznie zapłacona przez kupującego nie powinna ulec zmianie tylko dlatego, że cena samochodu zmieniła się po po sprzedaży. Zajrzyj here po więcej informacji.