2009-10-12 2 views
0

안녕하세요, 제 3 정규형으로 작성하지 않은 게으른 개발자가 설계 한 테이블이 있습니다. 그는 MM 관계를 사용하는 대신 테이블에 배열을 저장했습니다. 그리고 응용 프로그램이 실행 중이므로 데이터베이스 스키마를 변경할 수 없습니다.정상적인 제 3의 형식이 아닌 테이블을 쿼리하십시오.

나는 다음과 같은 테이블을 조회해야합니다

SELECT *를 myTable에 어디에서 사용자 그룹 = 20 사용자 그룹 필드가 같은 데이터를 포함

: 17,19,20 또는도 20 일 수 또는 만 19

나는 등으로 검색 할 수 있습니다 : myTable에 FROM SELECT * WHERE 사용자 그룹 LIKE (20) 하지만,이 경우는 200 예를 포함하는 필드도 일치합니다

아무 생각 없습니까? thanx

+0

'20'OR LIKE ', 20,':) 거대한 성능을 보았습니다. –

+0

RDBMS를 사용하고 계십니까? – cmsjr

+0

mysql. 필드는 사용자 그룹을 저장하는 데 사용되는 문자열입니다. –

답변

0

문자열로 저장된 목록을 포함하는 열 값을 구문 분석하려면 테이블 값 사용자 정의 함수 (SQL Server의 UDF는 다른 RDBMS에서 다른 이름을 사용합니다)를 작성하십시오. . 쉼표로 구분 된 목록의 각 항목에 대해 함수는 테이블 결과에 행을 반환해야합니다. 이와 같은 쿼리를 사용하는 경우 UDF에서 반환 된 결과에 대해 쿼리합니다.

+0

하나의 느린 쿼리가 될 것입니다! –

+0

동의합니다. 아마있을 것입니다. 그게 당신이 가난한 데이터베이스 디자인 (다른 누군가와 함께 살아야만하는)에 대한 것입니다. 결과를 캐시하기 위해 새로운 표를 도입 할 수는 있지만 처음에는 효과가 있다고 걱정할 것입니다. – RMorrisey

4

잘못된 데이터베이스 디자인을 수정하십시오.

단기적인 수정은 올바른 구조에 대한 관련 테이블을 추가하는 것입니다. 이전 필드의 정보를 삽입 및 업데이트 할 때 관련 테이블에 구문 분석 할 트리거를 추가하십시오. 그런 다음 스크립트를 작성하여 [기존 데이터를 구문 분석하십시오. 이제는 부유하게 쿼리 할 수 ​​있지만 이전 코드는 손상시키지 않았습니다. 그런 다음 이전 코드를 검색하고 수정할 수 있습니다. 일단 당신이 그것을 한 후에는 기존 테이블에 코드가 삽입되거나 우회되는 방식을 변경하여 새 테이블을 추가하고 이전 열을 삭제하십시오.

+0

이것은 좋은 제안입니다. 이전 버전과의 호환성을 유지하면서 더 나은 스키마로 마이그레이션하기위한 준비를 할 수 있습니다. – RMorrisey

0

쉼표로 구분 된 목록을 테이블로 변환하는 함수를 작성하십시오. 꽤 간단해야합니다. 그런 다음 IN()을 사용할 수 있습니다.

관련 문제