Do czego służy SET NULL w ograniczeniach usuwania / aktualizacji kluczy obcych?

15

Prawdopodobnie mam wąski umysł, ale jeśli utworzę ograniczenie klucza obcego, a wiersz zostanie zaktualizowany lub usunięty, utracę to połączenie, jeśli kolumna tabeli podrzędnej zostanie ustawiona na NULL.

Jaki jest cel celowego utrzymywania tych osieroconych rzędów?

Derek Downey
źródło
Szukam przypadków użycia i nie sądzę, że dotyczą one konkretnej bazy danych (tutaj mogą się mylić)
Derek Downey,
Nigdy nie spotkałem się z przypadkiem użycia tego ...
a_horse_with_no_name

Odpowiedzi:

13

To, czy set nulljest przydatne, czy nie, zależy od tego, co wybrałeś nullw danym kontekście - przy całym zamieszaniu i opiniach wokół nullIMO rozsądnym podejściem jest, aby DBA

  1. Wybierz (i udokumentuj), co to znaczy dla każdego dopuszczalnego pola
  2. Upewnij się, że oznacza to, że jedna tylko rzecz

Stosując te reguły, rozważ następujący przypadek użycia:

  • Masz „sklep” ze stołem (np. Poszczególne pomieszczenia)
  • Masz tabelę „detalista” (np. Sieci)
  • Tabela „sklepowa” zawiera pole odnośników odnoszące się do klucza „detalisty”
  • Zdecydowałeś nullsię reprezentować niezależny sklep (tj. Taki, który nie jest częścią sieci)
  • „Detalista” zamyka oddziały do ​​tego stopnia, że ​​uznajesz jego sklepy za niezależne

W tym przypadku ma on delete set nullto sens. Istnieją inne sposoby modelowania tych reguł biznesowych, ale jest to najprostszy i jeśli dokładnie pasuje do faktów, na których Ci zależy w prawdziwym świecie, sugeruję, że jest w porządku

Jack mówi, że spróbuj topanswers.xyz
źródło
Dobre punkty o ścisłym znaczeniu null, a na twoim przykładzie jasne jest, dlaczego jest to funkcja.
Derek Downey
1

Większość przypadków użycia, które mogę sobie wyobrazić, mają na ogół formę „Cóż, moglibyśmy zrobić coś innego, ale zamiast tego chcieliśmy to zrobić”.

Rozważ ownerpole błędu w systemie śledzenia problemów w firmie. Jeśli John zrezygnuje, z pewnością wszystkie jego problemy nie powinny być po prostu usunięte, gdy jego konto zostanie usunięte. Nawet wtedy niektóre bazy danych zezwalają SET DEFAULTjako działanie (lub mając wyzwalacz wykonujący to samo zadanie), a posiadanie Nobodypracownika jako domyślnego właściciela problemów może być opcją. Albo moglibyśmy mieć disabledpole dla Johna zamiast usuwać jego zapis.

DerfK
źródło
3
W takim przypadku argumentowałbym, aby nie zezwalać na usuwanie ( RESTRICT), jeśli z żadnego innego powodu, aby zrzucić winę na starego pracownika, gdy coś pójdzie nie tak!
Derek Downey