relacja SQL server

0

Witam
Robię sobie bazę w sql management studio. Mam problem z relacją zamieszczoną poniżej na rysunku. Mianowicie chcę, żeby w tabeli PRACE DYPLOMOWE IdTematu występowało tylko raz, ponieważ broniony może być tylko jeden identyczny temat pracy. Chcę również żeby pole IdTematu było powiązane (tabele PRACE DYPLOMOWE i PROPONOWANE TEMATY) relacją 1:1.
Jednak pojawia się problem, ponieważ gdy oznaczę IdTematu w tabeli Prace dyplomowe, jako PRIMERY KEY, to pole będzie musiało być zawsze wypełniane (NOT NULL), jednak ja chciałbym, żeby to pole mogło być puste, ponieważ w tabeli jest jeszcze pole w_temat ( własny temat).

Reasumując chce, żeby dało się wybrać swój lub proponowany temat przez promotora, czyli wypełniamy albo IdTematu albo w_temat.

P.S jeśli nie oznaczę IdTematu jako PRIMERY KEY i połączę to teraz tak jak jest to stworzy mi się relacja 1 do wielu, co też jest błędem. Chyba, żeby zostawić relację jeden do wielu, a sprawdzanie czy dany temat już nie został wpisany do tabeli napisać po stronie aplikacji?

Jak byście rozwiązali ten problem ?
user image

0

nie możesz mieć relacji 1:1, jeśli któraś z jedynek jest zerem (tj. w jednej tabeli nie ma danych odpowiadających danym z drugiej tabeli). jeśli chcesz mieć 1:1, to MUSISZ mieć w obu tabelach klucz not null. dlaczego pole "w_temat" miało warunkować w jakiś sposób typ relacji? przecież to pole może być null.

btw mieszasz dwa rodzaje notacji, wygląda to niechlujnie, do tego polskie nazewnictwo (ale to niby sprawa gustu)...

0

Chce jakoś tak to rozwiązać, że jeśli ktoś wybierze w_temat ( własny temat), to nie wybiera wtedy IdTematu (tematy określony z góry-do wyboru). Tak samo na odwrót, po wybraniu IdTematu, żeby nie było trzeba wybierać w_temat.

To jest właśnie problem - bo jeśli nie było by w_tematu to po prostu zrobił bym tak jak napisałeś czyli 1:1 i klucz główny dla IdTematu. Niestety założenia tego systemu mają pozwalać również na wybór własnego tematu, a jeśli dodam klucz główny do IdTematu to będzie znaczyło, że zawsze obligatoryjnie muszę to pole uzupełnić - o co w przypadku, gdy ktoś będzie chciał zadeklarować swój temat, czyli uzupełnić tylko w_temat bez IdTematu.

Jednocześnie system musi zapewnić, że jeśli ktoś wybierze dany temat to druga osoba nie będzie mogła go ponownie wybrać.
Proszę o jakieś wskazówki
Mi teraz jedynie przychodzi do głowy zostawić te dwie tabele bez relacji i po stronie aplikacji sprawdzać czy wybierane IdTematu nie znajduje się już w tabeli.

0

powtarzam, to nie jest relacja 1:1, tylko 1:N (N=0,1), nie załatwisz więc tego po stronie struktury bazy. możesz za to dodać triggery, które będą pilnować spójności danych.
swoją drogą IdTematu z tabeli Prace_dyplomowe nie jest kluczem głównym, więc (jeśli dobrze pamiętam) jako klucz obcy może zawierać nulle.

zgubiłeś relację między Proponowane_tematy a Pracownicy.

0

Wiem, że nie jest to relacja 1:1 - szukam po prostu jakiegoś sensownego rozwiązania.
Według ciebie tak to powinno wyglądać:
user image
Jednak relacja Id_tematu 1 do wielu jest błędna z założeniami, bo oznacza, że można przeprowadzić wiele obron prac dla jednego tematu (a tego byśmy nie chcieli).
Piszesz, że można zastosować wyzwalacze, jednak ja się nie spotkałem z taką konstrukcją wyzwalacza, która sprawdzała, czy w tabeli nie występuje już taka sama dana i przerywa wykonanie np. INSERTA. Ja używałem wyzwalaczy do jakiś operacji np. przed wykonaniem zapytania - ale nie spotkałem się z przerwaniem jakiegoś zapytania.

0

z kolei relacja 1:1 oznacza u Ciebie, że nie można zaproponować własnego tematu.
jeśli upierasz się, żeby mieć 1:1, to własny temat musisz wrzucać do tabeli z proponowanymi tematami, zmienić nazwę tabeli z "proponowane tematy" na "tematy" i ewentualnie dodać bit oznaczający typ pracy - własna/proponowana.

trigger typu AFTER może anulować całą transakcję, lub nie dopuścić do jej wykonania (INSTEAD OF), zresztą masz to opisane w msdn i nie tylko. a wewnątrz triggera możesz wykonać cokolwiek z całego repertuaru tsql, czyli np. select wrzucający coś do zmiennej i potem sprawdzić warunek z tą zmienną.

1 użytkowników online, w tym zalogowanych: 0, gości: 1