Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klucz obcy, który typ
Forum PHP.pl > Forum > Bazy danych > MySQL
markonix
Takie koncepcyjne pytanie.

Refaktoryzuję bazę danych i dorzucam kluczę obce dla lepszego porządku.
ON UPDATE/DELETE CASCADE idealnie nadaje się do relacji gdy jeden zbiór jest podzbiorem innego i podzbiór sam w sobie nie może istnieć.

Zastanawiam się jednak jaki typ nadać dla relacji:

Wiersz w bazie danych, jakiś rekord, który ma "creator_id" czyli id użytkownika, którzy utworzył ten rekord. Nie jest to rekord własności obiektu, a tylko taka dodatkowa informacja jak data utworzenia.
Zastanawiam się jakiej tu relacji użyć (jeśli w ogóle jest sens) bo na pewno usuwając użytkownika nie chce usunąć tego rekordu smile.gif
Pyton_000
ON UPDATE CASCADE/ON DELETE SET NULL
markonix
NULLowanie wydaje się logiczne. Widzę jednak w tym takie małe wady:
- nie rozróżniam wtedy czy np. obiekt nie miał twórcy od zawsze (np. NULL ma dodany manualnie, przez system)
- ID nawet bez połączenia jest jakąś informacją, a w ostateczności można za pomocą backupów zawsze można dojść do źródła.

Najchętniej bym zrobił samo ON UPDATE CASCADE niestety nie da się ustalić tylko jednej akcji.
Damonsson
Czemu chcesz wywalać tego usera całkowicie z bazy? Rób po prostu soft delete.
phpion
W tym przypadku zrezygnowałbym z klucza obcego. Mają one na calu zachowanie integralności danych, a Twoje założenie temu przeczy (usuwasz użytkownika, a chciałbyś jednak pozostawić jakiś ślad w postaci jego ID). Zostaw więc kolumnę bez żadnego klucza obcego.
markonix
Oboje macie racje.

1) Robię soft delete choć wiadomo, że po czasie warto by jednak usuwać takie konta i problem wróci.
Soft delete też czasami rodzi problemy gdy gdzieś zapomni się odfiltrować usunięte rekordy stąd trzeba z nim uważać. Pomijam już zupełnie kwestie prawne.
2) Słusznie nie da się zrobić tylko samego UPDATE bo to burzy założenia kluczy obcych. Albo jest twarda relacja, albo nullujemy.

W sumie zostawię decyzję na potem. Ostatecznie albo zostawię bez klucza albo UPDATE -> NULL.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.