Z mojego doświadczenia wynika, że wiele projektów, które przeczytałem w przeszłości, nie zawierało definicji relacji w bazie danych, a jedynie zdefiniowało je w kodzie źródłowym. Zastanawiam się więc, jakie są zalety / wady definiowania relacji między tabelami w bazie danych i kodzie źródłowym? A szersze pytanie dotyczy innych zaawansowanych funkcji współczesnych baz danych, takich jak kaskada, wyzwalacze, procedury ... W moich myślach są pewne kwestie:
W bazie danych:
Prawidłowe dane z projektu. Zapobiegaj błędom aplikacji, które mogą powodować nieprawidłowe dane.
Ogranicz liczbę podróży w obie strony do aplikacji podczas wstawiania / aktualizowania danych, ponieważ aplikacja musi wykonać więcej zapytań, aby sprawdzić integralność danych.
W kodzie źródłowym:
Bardziej elastyczne.
Lepsze przy skalowaniu do wielu baz danych, ponieważ czasami relacja może być między bazami danych.
Większa kontrola nad integralnością danych. Baza danych nie musi sprawdzać za każdym razem, gdy aplikacja modyfikuje dane (złożoność może wynosić O (n) lub O (n log n) (?)). Zamiast tego jest delegowany do aplikacji. I myślę, że obsługa integralności danych w aplikacji spowoduje więcej pełnych komunikatów o błędach niż korzystanie z bazy danych. Np .: kiedy tworzysz serwer API, jeśli zdefiniujesz relacje w bazie danych i coś pójdzie nie tak (np. Encja, do której istnieje odwołanie, nie istnieje), otrzymasz wyjątek SQL z komunikatem. Prostym sposobem będzie zwrócenie klientowi 500, że występuje „Wewnętrzny błąd serwera” i klient nie będzie miał pojęcia, co się dzieje. Lub serwer może przeanalizować komunikat, aby dowiedzieć się, co jest nie tak, co moim zdaniem jest brzydkie i podatne na błędy. Jeśli pozwolisz aplikacji to obsłużyć,
Czy jest coś jeszcze?
Edycja: jak wskazuje Kilian, moje zdanie na temat wydajności i integralności danych jest bardzo mylne. Zedytowałem więc, żeby poprawić mój punkt. Całkowicie rozumiem, że pozwolenie na obsługę bazy danych będzie bardziej wydajnym i niezawodnym podejściem. Sprawdź zaktualizowane pytanie i podziel się z nim przemyśleniami.
Edycja: dziękuję wszystkim. Odpowiedzi, które otrzymałem, wskazują, że ograniczenia / relacje powinny być zdefiniowane w bazie danych. :) Mam jeszcze jedno pytanie, ponieważ jest ono całkowicie poza zakresem tego pytania, właśnie opublikowałem je jako osobne pytanie: Obsługa błędu bazy danych dla serwera API . Proszę zostawić pewne spostrzeżenia.