2013-07-05 3 views
0

현재 상당히 큰 규모의 오피스 웹 애플리케이션을 유지 관리하고 있습니다. 나는 최근에 웹 브라우저 내의 다양한 개발자 툴을 통해 셀렉트 박스의 가치가 사용자에 의해 쉽게 변경 될 수 있다는 것을 알게되었다. 서버 측에서는 게시 된 데이터가 숫자인지 아닌지 (드롭 다운의 경우) 유효성 검사를 수행하지만 실제로 데이터베이스 테이블에 값이 있는지 확인하지는 않습니다. 예를 들어 인사말 용 드롭 다운 상자가 있습니다 ('mr ','ms ','mrs ','Mr/ms ') 등을 입력 할 수 있습니다.mysql에 대한 참조 무결성

은 현재 내가 참조 무결성 외래 키를 제공하지 않습니다 MySQL의의 MyISAM 테이블을 사용, 그래서 이노 디비 이동에 대해 생각하고, 아직이 다음과 같은 문제 민병대 : 나는 참조 무결성을 적용 할 경우

(보장하기를 유효한 ID가 삽입 된 경우), 성능 문제 (예 : 인사말 드롭 다운)에 대해 색인을 생성 할 필요가없는 모든 열 (무결성 검사를 사용하는 경우)을 색인화해야한다는 뜻입니다. 매우 큰 데이터베이스 클라이언트 테이블에 simular dropdowns (예 : clientgroup, 직원 수, country-region 등)이 10 개라고하면 연결된 모든 테이블을 과도하게 색인하는 것으로 보입니다.

내 질문 : 참조 무결성을 사용할 때

1), 열은 정말도 색인화해야합니까

?

2) 제가 간과 할 수있는 다른 실질적인 해결책이 있습니까? (예 : 모든 드롭 다운 목록에 대해 값이 테이블에 있는지 확인하기 위해 별도의 쿼리를 사용하십시오.)

3) 다른 웹 응용 프로그램은 어떻게 이러한 문제를 처리합니까?

도움말 감사드립니다!

감사 패트릭

답변

1

경우에만 외부 키 관계에 사용되는 필드와 MySQL의 최신 버전은 어쨌든 당신을 위해 자동으로 수행 인덱스에 있습니다. 그것은 "잔인한"것이 아닙니다. 그것은 실제로 최적화입니다.

언제든지 레코드를 업데이트/삭제/삽입 할 때 인덱스가없는 외부 테이블을 검사해야합니다. 인덱스가 없으면 이러한 검사는 속도가 느릴 수 있습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다 .-) 내 생각에 MyIsam 테이블은 이러한 검사를 수행하지 않습니다. 기본적으로 '외래 키'로 지정된 값을 삽입 할 수 있습니다. 인덱싱을 희박하게 적용해야한다는 것도 알고 있습니다. 높은 카디널리티를 발생시키는 열을 사용하여 성능을 향상시키는 데 필요한 경우에만 필요합니다. – user2022678

+0

네, 맞습니다. myisam은 외래 키 선언을 구문 분석/허용하지만 기본적으로 자동 무시되고 절대 적용되지 않습니다. 그리고 아니, 인덱스에 대한 어림짐작은 어디에/조인/주문 또는 다른 "가치 테스트"유형 상황에서 사용되는 필드에 적용하는 것입니다. –

1
  1. InnoDB는 외래 키를 정의 할 때 색인을 자동으로 생성합니다. 그 열의 인덱스가 벌써 존재하는 경우, InnoDB는 새로운 인덱스를 작성하는 대신에이 인덱스를 사용합니다.

    @MarcB는 그의 대답에서 언급했듯이 InnoDB는 이러한 인덱스를 사용하여 일부 데이터 변경 유형 중에 참조 무결성 검사를보다 효율적으로 수행합니다. 이러한 변경에는 부모 테이블의 값 업데이트 또는 삭제와 계단식 작업이 포함됩니다.

  2. ENUM data type을 사용하여 열을 고정 된 값 집합으로 제한 할 수 있습니다. 하지만 ENUMhas some disadvantages도 있습니다.

  3. 일부 웹 개발자는 외래 키를 사용하지 않습니다. 동일한 데이터 무결성 보장을 제공하기 위해 모든 경우에 애플리케이션 코드를 작성해야합니다. 따라서 반복적 인 코드를 많이 작성하고 테스트하고 싶다면 RDBMS가 이미 효율적으로 제공하는 기능을 불필요하게 복제 한 다음 계속 진행하십시오! :-)

    외래 키를 사용하지 않는 대부분의 개발자는 추가 검사를 쓰지 않습니다. 그들은 단지 데이터 무결성을 시행하지 않습니다. 나는.그들은 품질을 희생했습니다.

추신 : 나는 InnoDB로 전환하는 것을 권장하며 참조 무결성은 그 이유 중 하나 일뿐입니다. 기본적으로, ACID을 지원하는 데이터베이스를 원한다면, InnoDB는 모든 측면을 지원하고 MyISAM은 아무 것도 지원하지 않는다.