Aby dać pojęcie o czym mówię, rozważ podmiot (w moim przypadku jest to Task
), który może być powiązany z dowolną liczbą innych elementów w systemie. Dla naszych celów powiedzmy, że zadanie może być związane z:Baza danych SQL Server - jak obsługiwać tabelę, która może być powiązana z dowolną liczbą innych tabel?
- Projekt
- Konto
- biletów
- Osoba
- itp
Wszystkie te reprezentowane są z własnych tabel w bazie danych. Teraz zadanie może być potencjalnie powiązane z jednym z nich, a ze względu na aktywny rozwój systemu, lista potencjalnych połączeń będzie nadal rosła stosunkowo szybko. Uwaga: są to relacje od 1 do wielu - zadanie można połączyć tylko z jednym z nich naraz, ale jedno konto może mieć przypisane wiele zadań.
Rozważałem teraz kilka opcji, ale nie uważam się za ekspertów od projektowania baz danych, więc pomyślałem, że sięgnę. Opcje, jakie uznała więc narazie to:
Klucz obcy dla każdego łącza w tabeli
Task
, a my po prostu trzeba zachować dodanie kolumny. Jednak ponieważ zadanie nie może być połączone z więcej niż jednym z nich na raz, spowoduje to wiele kolumn FK z wartościami NULL. Będzie to również wymagało nowej kolumny i regeneracji naszego modelu bazy danych w naszej aplikacji za każdym razem, gdy dodamy nowy link.Pojedyncza kolumna
Task
który działa jako klucz obcy, ale to inną kolumnę określającą linktype
, więc podczas odpytywania przeciw niemu możemy określić, który przyłącza się zdarzyć w zależności od rodzaju. Tak więc zarówno Konto, jak i ID osoby będą w tej kolumnie dla swoich zadań, ale kolumna typu połączenia określa, czy ID jest osobą czy kontem. Jest to dla mnie bardzo ryzykowne i oczywiście ograniczenia nie mogą być egzekwowane przez bazę danych.Inne opcje?
chciałbym, jeśli ktoś był w stanie wskazać mi w kierunku „czystszego” projektu, ale jeśli nie, to wielokrotne kolumny działającego w charakterze ograniczeń FK, ale pozwalając NULL być najlepszym?
Z góry dziękuję!
Przed podobnym wyzwaniem stanęłam kilka lat temu. Bez większego zastanowienia zdecydowałem się na drugą opcję. Zamiast używać object_id w sys.object, utworzyłem nową tabelę, która zawiera stałą, która tabela. Słyszałem gdzieś, że ten projekt jest zły, ale nigdy nie słyszałem, dlaczego. Pięć lat później ten typ linków był używany prawie wszędzie w aplikacji (komentarze, dokumenty, parametry itp.). W pewnym sensie stał się on rdzeniem aplikacji. Nie spodziewałem się tego w tamtym czasie, ale jestem dumny z tego, jak się rozwinęło. – AXMIM
Po moim poprzednim komentarzu, ponieważ już tam nie pracuję, więc nie mogę stwierdzić, czy teraz szkodzą temu efektowi. Trzymał się dość solidnie przez 5 lat. Muszę jednak przyznać, że widziałem serwer SQL, który wykonał jakiś dziwny plan zapytania jeden lub dwa razy z tego powodu i że jest tu kilka małych wad. Również struktura podmiotu nie była w pobliżu. Nie jestem pewien, czy zaufałbym EF do obsługi tych połączeń. – AXMIM
To jest nowa instancja powtarzającego się pytania * stowarzyszeń polimorficznych *. Gdy znasz już oficjalny termin, łatwo jest znaleźć sposób na zrobienie tego. –