Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy klucz obcy może mieć wartość null?

Kolumna (lub kolumny) klucza podstawowego nie może mieć wartości NULL. Rekord nie może być jednoznacznie identyfikowany przez NULL. Tak więc kolumny ID na wskazanym końcu klucza obcego muszą być zdefiniowane jako NOT NULL.

Jednak decyzja projektowa, aby relacja klucza obcego była opcjonalna, jest uzasadnioną decyzją, a sposobem na jej reprezentację jest opcjonalna część odwołująca się do końca klucza, tj. Zezwolenie na wartości NULL.

W kategoriach modelowania danych to, co opisałeś, jest (wyłącznym) łukiem:„tabela ... z co najmniej dwoma kluczami obcymi, gdzie jeden i tylko jeden z nich może być inny niż null”. W modelowaniu logicznym łuki są całkowicie akceptowalne, ale istnieje silna opinia przemawiająca za implementacją ich jako oddzielnych tabel. W twoim scenariuszu byłaby to ogólna Sale tabela plus dwie tabele podtypów, VehicleSale i PieceSale .

Zalety oddzielnej implementacji tabeli to:

  • łatwiejsze egzekwowanie ograniczeń klucza obcego;
  • łatwiejsze dodawanie dodatkowych kolumn dotyczących (powiedzmy) sprzedaży pojazdów, które nie mają zastosowania do sprzedaży jednostkowej;
  • łatwiejsze rozszerzenie modelu o dodatkowe podtypy;
  • wyraźniejszy model danych, który może uprościć tworzenie aplikacji.

Jednak korzyści nie są jednostronne. Chociaż dość łatwo jest upewnić się, że Sale dotyczy zarówno VehicleSale lub PieceSale ale nie jedno i drugie, wymuszając regułę, że Sale musi posiadanie rekordu dziecka faktycznie staje się dość szorstkie.

Tak więc przeważającą radą jest to, że ekskluzywny łuk jest błędny i generalnie jest to dobra rada. Ale nie jest to tak jasne, jak niektórzy twierdzą.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę dołączyć/konkatenować dane BLOB do kolumny BLOB za pomocą polecenia SQL UPDATE w ORACLE

  2. Oracle Konwertuj wiersze na kolumny

  3. Tajemniczy kod SQL blokujący wykonanie mojej procedury składowanej w systemie ORACLE

  4. Jaka jest maksymalna długość wyciągu w Oracle?

  5. Wywoływanie Pythona z Oracle