2010-12-30 3 views
0

나는 현재이 데이터베이스 구조를 가지고있다.SQL 모델링/쿼리 질문

이 항목들은 모두 데이터가 저장된 텍스트, URL 또는 파일 테이블에 정확히 하나의 해당 항목이 있습니다.

해당 항목과 해당 데이터가 모두 포함 된 항목을 효율적으로 선택하려면 쿼리가 필요합니다.

그래서 내 첫 번째 방법은 그것을 통해

SELECT * FROM entries LEFT JOIN entries_items LEFT JOIN texts LEFT JOIN urls LEFT JOIN files 

같은가 someting 다음 루프이었고, 내 응용 프로그램의 후 처리 작업을 수행.

하지만 다른 유형의 항목이 여러 개 존재한다는 것은 거의 없습니다. 항목 당 하나 이상의 항목이 존재하는 드문 경우입니다. 그리고 대부분의 경우 파일이됩니다. 하지만 그게 필요해 ...

eveyr 항목에 대한 모든 3 개의 테이블을 스캔하지 않도록 case/switch와 같은 것을 할 수 있고 entries_items의 "type"값을 기준으로 해당 테이블을 스캔 할 수 있다고 생각했습니다.

하지만 제대로 작동하지 않습니다.

또한 응용 프로그램에서 case/switch 로직을 만들려고 생각했지만, mysql 서버가 외부에있을 때 느리게 실행되는 쿼리가 여러 개있을 것입니다.

더 나은 접근 방법을 사용하면 구조를 변경할 수도 있습니다.

"texts", "urls"및 "files"의 모든 필드가 entries_items 테이블 옆에 있으며, 단지 1 : 1 관계로 사용되며 null이 필요없는 모든 항목 만 있습니다. 그 찬성/반대 의견은 무엇이 될까요? 나는 그것이 더 많은 저장 공간을 필요로한다고 생각한다. 그리고 내가 지금 가지고있는 것에 따라 cannt는 나의 cosntraints를한다. 모든 것이 null이어야합니다 ...

글쎄, 나는 모든 종류의 아이디어에 열려 있습니다. 신청서는 아직 작성되지 않았으므로 기본적으로 원하는대로 변경할 수 있습니다.

+0

이 질문은 당신이 여기에 설명 한 내용의 경계를 넘어 길을 간다 생각합니다. 예를 들어, 모든 테이블을 스캔하고 싶지는 않다고 말한 것입니다. 그것은 테이블 추구와 비교 되는가? 엔트리 테이블에 몇 행이 있습니까? 한 번에 하나의 항목을달라고한다면 얼마나 많은 전화를 할 것입니까? 여기서 일하는 데 너무 많은 요소가 있습니다. 나는 당신이 어떤 장점이있는 간단한 대답을 얻지 못할 것이라고 생각합니다. (선택된 답변자에게는 아무런 불쾌감이 없음) –

답변

1

중간 테이블 ENTRIES_ITEMS을 (를) 통해 기본 ENTRIES 테이블에 링크되는 세 가지 다른 엔티티 유형 (URL, TEXT, FILE)이 있으며이 '조건부 참여'방식을 사용하는 일반 양식을 위반하고 있습니다. 구조가 주어지면 id 열이 URLS, TEXTS 또는 FILES 테이블을 참조 할 수 있으므로 ENTRIES_ITEMS.id에 외래 키 제약 조건을 선언 할 수 없습니다. ENTRIES_ITEMS 테이블을 정규화하려면 세 개의 개별 필드, urlid, textid 및 fileid를 추가하고 nullable로 허용해야하며 그러면 연결 테이블을 통해 ENTRIES 테이블에 각각의 엔티티 테이블을 결합 할 수 있습니다. 당신이 취하는 접근법은 SQL92를 사용하지 않는 레거시 데이터베이스에서 흔히 볼 수 있습니다. SQL92를 사용하여 선언적으로 사용하는 대신 엔티티 테이블에서 프로그래밍 방식으로/절차 적으로 값을 가져 왔습니다.

+0

3 개의 다른 ID 필드는 좋은 생각처럼 들립니다. –

1

먼저 "entries_items"테이블에 텍스트, URL 및 파일의 XML 표현이 포함 된 열을 추가하는 것이 좋습니다. MySQL에 대해서는 말할 수 없지만 SQL Server에는 XML 처리를위한 환상적인 기능이 있습니다. MySQL도 그렇게 할 것입니다.

그런 최첨단 기술이 아니라면, 내가 생각하기에 레트로로 돌아가서 하나의 항목 테이블에 null이 많은 것을 고려해 볼 수 있습니다.

+0

와우, 꼭 알아봐야 겠어! 난 더 "고전적인 SQL"솔루션을 선호하는 것이 좋습니다. –

1

이렇게하면 시작할 수는 있지만 계층 구조 (parent_id)는 entriesentries_items입니다.

select * 
from entries  as e 
join entries_items as i on i.entry_id = e.id 
left join texts as t on t.item_id = i.id and i.type = 'text' 
left join urls  as u on u.item_id = i.id and i.type = 'url' 
left join files as f on f.file_id = i.id and i.type = 'file' 
; 

모델 정리를 고려하면 이는 출발점 일 수 있습니다.

alt text

+0

이게 나에게 보이는 것은 내가 지금 가지고있는 것이지만, 조인 조건에 대한 감사;) –