내 경험상, 과거에 읽은 많은 프로젝트는 데이터베이스에 관계 정의가 없었고 대신 소스 코드에서만 정의했습니다. 그래서 데이터베이스와 소스 코드에서 테이블 간의 관계를 정의 할 때의 장점 / 단점이 무엇인지 궁금합니다. 더 넓은 질문은 캐스케이드, 트리거, 프로 시저와 같은 최신 데이터베이스의 다른 고급 기능에 관한 것입니다. 내 생각에는 몇 가지 요점이 있습니다.
데이터베이스에서 :
설계에서 정확한 데이터. 유효하지 않은 데이터를 일으킬 수있는 응용 프로그램 오류를 방지하십시오.
응용 프로그램은 데이터 무결성을 확인하기 위해 더 많은 쿼리를 작성해야하므로 데이터를 삽입 / 업데이트 할 때 응용 프로그램으로의 네트워크 왕복을 줄입니다.
소스 코드에서 :
더 유연합니다.
때때로 데이터베이스 간 관계가있을 수 있으므로 여러 데이터베이스로 확장 할 때 더 좋습니다.
데이터 무결성에 대한 통제력 강화. 데이터베이스는 응용 프로그램이 데이터를 수정할 때마다 확인할 필요가 없습니다 (복잡성은 O (n) 또는 O (n log n) (?) 일 수 있음). 대신 응용 프로그램에 위임됩니다. 그리고 응용 프로그램에서 데이터 무결성을 처리하면 데이터베이스를 사용하는 것보다 더 자세한 오류 메시지가 발생한다고 생각합니다. 예 : API 서버를 생성 할 때 데이터베이스에 관계를 정의하고 참조 엔터티가 존재하지 않는 것과 같은 문제가 발생하면 메시지와 함께 SQL 예외가 발생합니다. 간단한 방법은 "내부 서버 오류"가 있음을 클라이언트에게 500을 반환하는 것이며 클라이언트는 무엇이 잘못되었는지 알 수 없습니다. 또는 서버가 메시지를 구문 분석하여 무엇이 잘못되었는지 알아낼 수 있습니다. 제 생각에 추악하고 오류가 발생하기 쉬운 방법입니다. 응용 프로그램에서이를 처리하도록 허용하면
다른 것이 있습니까?
편집 : Kilian이 지적했듯이 성능 및 데이터 무결성에 대한 나의 요지는 매우 잘못되었습니다. 그래서 나는 내 요점을 수정하기 위해 편집했습니다. 데이터베이스를 처리하는 것이 더 효율적이고 강력한 접근 방법이라는 것을 완전히 이해하고 있습니다. 업데이트 된 질문을 확인하고 그것에 대해 몇 가지 생각을하십시오.
편집 : 모두 감사합니다. 내가받은 답변은 제약 조건 / 관계가 데이터베이스에 정의되어야한다고 지적합니다. :). 이 질문의 범위를 벗어나기 때문에 질문이 하나 더 있습니다. 방금 별도의 질문으로 게시했습니다 : API 서버의 데이터베이스 오류 처리 . 통찰력을 남겨주세요.