2010-07-26 4 views
1

회사의 제품을 나타내는 mySQL 테이블이 있습니다. 이 표는 두 제품이 서로 호환되는지 여부를 보여줍니다.행은 중복되지만 중복 데이터가 없음

표는 행 중에 중복되어 있지 않은 일부 데이터가 중복이라고 다소

같은
Product1 Product2 Compatible? 
A   A   Yes 
A   B   ? 
A   C   No 
A   D   ? 
B   A   ? 
B   B   Yes 
B   C   ? 
B   D   Maybe 
C   A   No 
C   B   ? 
C   C   Yes 
C   D   ? 
D   A   ? 
D   B   Maybe 
D   C   ? 
D   D   Yes 

주를 보인다. A가 C와 호환되지 않으면 C는 분명히 A와 호환되지 않습니다. 이렇게하면 한 행이 중복됩니다. 이러한 행이있는 이유는 중첩 된 for 루프를 사용하여 테이블을 작성했기 때문입니다. 공간을 절약하기 위해 중복 된 의미로 행을 삭제 하시겠습니까? 아니면 (아마도?) 유지 보수를 위해 거기에 두십시오.

답변

0

데이터를 올바르게 정상화하는 것이 거의 항상 가치가 있습니다. 데이터 량이 적어지고 모순이 생길 가능성이없는 이유는 두 가지 가장 분명한 이유입니다. 따라서 호환성이 실제로 대칭이라고 보장되고 영원히 대칭을 유지한다면 (상향식과 하위 버전과의 호환성이 아닌 ...) 그러면 중복 된 행을 삭제해야합니다.

유일한주의 사항은 장래에 하위 제품과의 호환성을 쿼리해야하지만 쿼리의 첫 번째 슬롯에서 호환성을 쿼리하거나 분리형 쿼리를 사용해야한다는 것입니다. 그렇지 않으면 합법적 인 조합을 놓칠 수 있습니다. (두 번째 옵션은 불필요한 처리 노력을 다시 유도하기 때문에 이러한 옵션 중 첫 번째 옵션이 더 나은 해결책입니다.)

+0

사용자가 확인하고 싶은 두 제품을 입력하면 어떻게 될까요? "B"와 "A"가 아닌 "A"와 "B"를 선택하는 경우 제어 할 수 없습니다. – thomas

+0

그런 다음 비즈니스 코드는 쿼리를 실행하기 전에 두 제품을 정렬해야합니다. 즉, TextInput 위젯에서 직접 데이터베이스 쿼리를 생성하는 것과는 다릅니다. <크리핑 크리켓 소리> 어 ... 맞습니까? –

+0

아직 작성하지 못했습니다 (아니요, 바로 textinput에서 생성되지 않습니다).하지만 좋은 지적입니다. 감사합니다. 저는 MySQL에 상당히 익숙하며 모든 작업을 정결하게하려고 노력합니다. – thomas

1

공간이 쌉니다 ... 오늘의 세계에서 데이터를 삭제할 필요가 없습니다. 그러나 이것이 우리가 효율적 일 수는 없음을 의미하지는 않습니다. 데이터베이스 설계 문제로이 문제가 발생하면 두 개의 테이블을 작성합니다. 작업을 완료 한 제품

호환성을 위해

하나에 대한

하나.

위의 예에서 비 호환성을 추적하는 이유는 없습니다. 제품이 호환성 표에 있다면 호환 가능하다는 것을 의미합니다 ... 호환되지 않는다는 것을 의미합니다.

이 행을 채우는 방법 ... A 행을 C 행에 추가하는 이유는 알 수 없지만 C 행을 A 행에 추가하는 이유는 무엇입니까? 왜 두 번째 행을 추가해야합니까?

테이블에서 제품 A 및 B의 테이블 열에있는 정확한 데이터는 무엇입니까? 제품 ID? 상품명?

+0

호환성 테이블을 만들 때 여전히 두 배가됩니다. 기본 키의 고유 인덱스가 있더라도 (A, C) 및 (C, A) 쌍을 생성 할 수 있습니다. 그럴 경우 해결 방법은 before_insert 트리거를 만들어 다른 방법으로 시도했을 때 쌍이 고유하다는 것을 확인하는 것입니다. –

+0

for 루프를 사용하여 처음 두 열만 채 웠습니다. 세 번째 열을 채우지 않았습니다. 모두 아직. 더 많은 제품이 있습니다. 예제를 만들려고했는데, 조금 단순화했습니다. – thomas

+0

제품이 호환되지 않을 때 호환성 테이블에 제품이 들어갑니다. 단순히 이진 예/아니오가 아니기 때문입니다. "아직 테스트 중"인 것들도 있습니다. – thomas

관련 문제