1

저는 MySQL에 큰 데이터베이스를 구축하고 SQLYog가있는 테이블 사이의 모든 관계를 만들었습니다. 그게 다 좋지만 좋긴하지만 PHP 사이트에서는 데이터베이스에서 행을 삭제할 때 종종 문제가 발생합니다. 종종 참조 무결성 제약 조건에 부딪칩니다. 그럼 나는 데이터를 삭제하거나 먼저 연결 테이블에서 NULL로 필드를 설정하려고합니다. 나는 보통 이것을 시행 착오로 작동시킬 수는 있지만 이것을해야만하는 방법이나 적절한 과정이없는 것으로 보인다. 내가 '삭제 집합에 NULL 또는 계단식 삭제 설정'을 사용해야합니까? 사용할 테이블을 모르거나 다른 테이블의 중요한 데이터를 삭제할 수 있다고 걱정됩니다.MySQL 관계 및 제약 조건을 사용해야합니까?

사람들은 데이터베이스의 관계 제약 조건을 설정하는 것을 방해합니까? PHP 코드에서 링크 된 다른 테이블을 업데이트하기 위해 삭제를 수행하는 것이 훨씬 쉬워 보일 것이라고 생각합니다.

도움을 주시면 감사하겠습니다.

+3

데이터베이스에 제한을 추가하는 경향이 있습니다. 깨진 코드는 일시적이며 깨진 데이터는 영원합니다. 예, 제약 조건을 관리하는 것은 어려울 수 있지만 제약 조건이 없기 때문에 깨진 데이터베이스를 정리하는 것은 불가능합니다. –

+4

사실, 무결성 검사의 중요성을 인식하기 위해 가증하고 깨진 데이터베이스 디자인을 포함하는 한 번의 죽음 행진에 대해서만 작업하면됩니다. 데이터베이스는 중간 계층을 신뢰하지 않아야하며 중간 계층은 표현 계층을 신뢰해서는 안됩니다. – Thomas

답변

3

데이터베이스는 자체 외부의 데이터를 신뢰해서는 안되기 때문에 데이터베이스를 자체 관리해야합니다. 너무 자주 데이터베이스에 대한 직접 연결이 필요하고 원래 응용 프로그램에서 설정 한 모든 규칙을 위반 한 시스템을 보았습니다. 데이터베이스는 종종 여러 응용 프로그램에 의해 사용되기 시작하므로 자체적 인 데이터 무결성을 구현해야합니다. 다른 개발자가 응용 프로그램이나 중간 계층을 완전히 우회한다고 가정합니다. 또한 데이터베이스는 원래 서비스를 제공하기 위해 만들어진 응용 프로그램보다 훨씬 오래 서비스되는 경향이 있습니다.

예, 데이터베이스 설계에서 외래 키 제약 조건, null 허용 제한 조건의 올바른 사용 등을 통합하는 것이 중요합니다. 접하게되는 참조 무결성 제약 조건은 고아 행에 대한 데이터를 보호하기위한 것입니다. 또한 테이블이 서로 어떻게 관련되는지에 대한 문서를 제공합니다.

부모를 제거 할 때 논리적으로 제거해야하는 하위 엔터티가있는 경우 삭제를 계단식으로 수행 할 수 있습니다. 부모를 삭제하는 모든 코드가 이미 자식을 삭제하도록 코딩되어 있지 않으면 삭제를 계단식으로 처리하지 않아서주의를 기울이는 경향이 있습니다.이 경우 삭제를 연쇄 적으로 수행 할 수도 있습니다. 캐스케이드 업데이트는 분명 더 안전하며 일반적으로 성능에 대해 걱정하거나 디자인의 제한으로 인해 구현할 수없는 경우가 아니면 구현하지 않는 이유가 없습니다.

3

정말 당신이 저장하는 데이터의 종류에 따라, 당신은 정말로 참조 무결성을 가지고 데이터가 필요합니까? 대부분의 '정보 시스템'에서 이것은 필수 항목입니다.

두 번째 단락을 참조 :

나는 그 다음 삭제를 수행 PHP 코드에 링크 된 다른 테이블을 업데이트 할 몇 가지 추가 라인을 작성하는 훨씬 더 쉽게 보일 수있을 것입니다 의미한다.

그렇습니다. 소규모 시스템 만 만들었지 만 응용 프로그램이 성공적이라고 상상해보십시오. 더 많은 고객, 더 많은 기능을 구현해야하며 더 많은 프로그래머가 필요합니다. 그는

무결성 제약 응용 프로그램을 별도로 지정해야합니다 말했을 때 필연적으로 업데이트/삭제/당신이 커드 농담되지 않았 음을 이해하게 될 것입니다 순간이 될 것이다, 데이터베이스에 관련 데이터를 삽입하는 것을 잊지 및 카탈로그에 저장됩니다. 기존 응용 프로그램에 불필요하게 영향을 미치지 않고 적절한 제약 조건을 변경할 수 있어야합니다.

당신이 DBMS가 작업을 할 수 있도록 항상 (그리고 더 낫다고 당신은 대부분의 경우에 할 말을) 더 나은 참조 무결성을 오기 '를 제어해야하는 경우 커드의 규칙 here

+0

좋은 설명 thanks ZaQ. – zuallauz

1

을 읽어 너를 위해서.

동일한 데이터를 사용하는 다른 응용 프로그램 (현재 또는 미래)이있을 수 있고 코드에있을 때와 마찬가지로 효율적이기 때문에 신중해야합니다.

좋은 DBMS는 항상 제약 조건을 검사합니다 (예 : 외래 키의 삽입이 유효한 값, 즉 참조 된 테이블에 존재하는 값)가 코드보다 빠르다는 것을 확인합니다. 이런 종류의 검사가 관계형 데이터베이스의 핵심이기 때문에 DBMS는 매우 유용합니다.