我想要保持数据库记录的不重复,现在有两种方案,一种是给这一个(或多个)字段添加唯一性约束,一种是程序先去查询数据库是否存在给个字段值的记录,再决定是否插入?请问这两种方式该如何抉择?有更好的方式么?
认证高级PHP讲师
고유성을 보장하기 위해 프로그램에 의존하는 것은 신뢰할 수 없습니다. 동시성이 높은 상황에서는 다음 두 단계가 겹쳐서 반복 삽입이 발생하기 때문입니다.
데이터베이스에 이미 레코드가 있는지 확인
그렇지 않은 경우 기록 삽입
고유한 제약 조건을 선택하는 것이 더 좋습니다:
애플리케이션 로직을 단순화합니다.
고유 제약 조건을 설정할 때 시스템은 일반적으로 쿼리 성능을 높이면서 고유성을 보장하기 위해 자동으로 인덱스를 생성합니다. (PostgreSQL 문서)
고유 제약 조건을 추가하면 제약 조건에 나열된 열 또는 열 그룹에 고유한 B-트리인덱스가 자동으로 생성됩니다.
저자는 데이터베이스의 목적이 무엇인지 이해해야 합니다. 데이터베이스 시스템은 파일 시스템에서 개발됩니다. 두 번째 옵션을 따르면 데이터베이스를 직접 저장할 수 있습니다. 데이터베이스는 단순한 SQL이 아니라 DBMS로서 다양한 기능을 제공하므로 시스템의 기본 액세스를 최적화하는 동시에 애플리케이션 문제 해결에 집중할 수 있습니다.
고유성을 보장하기 위해 프로그램에 의존하는 것은 신뢰할 수 없습니다. 동시성이 높은 상황에서는 다음 두 단계가 겹쳐서 반복 삽입이 발생하기 때문입니다.
데이터베이스에 이미 레코드가 있는지 확인
그렇지 않은 경우 기록 삽입
고유한 제약 조건을 선택하는 것이 더 좋습니다:
애플리케이션 로직을 단순화합니다.
고유 제약 조건을 설정할 때 시스템은 일반적으로 쿼리 성능을 높이면서 고유성을 보장하기 위해 자동으로 인덱스를 생성합니다. (PostgreSQL 문서)
저자는 데이터베이스의 목적이 무엇인지 이해해야 합니다. 데이터베이스 시스템은 파일 시스템에서 개발됩니다. 두 번째 옵션을 따르면 데이터베이스를 직접 저장할 수 있습니다. 데이터베이스는 단순한 SQL이 아니라 DBMS로서 다양한 기능을 제공하므로 시스템의 기본 액세스를 최적화하는 동시에 애플리케이션 문제 해결에 집중할 수 있습니다.