2014-10-13 5 views
2

SQL 스키마에 세 개의 테이블이 있습니다. 주소가있는 클라이언트는 업로드 된 파일을 저장하는 주문 세부 정보 및 파일로 주문합니다. 파일 테이블과 orders 테이블 모두 Client 테이블을 참조하는 외부 키를 포함합니다.SQL 데이터베이스 스키마를 IndexedDB로 번역하십시오.

IndexedDB에서 어떻게합니까? 이 전체 키 - 인덱스 - 사고 방식에 익숙하지 않고 단지 indexedDB로 어떻게 동일한 일이 이루어질 것인지 이해하고 싶습니다.

이제 shim.js 파일이 있다는 것을 알고 있지만 개념 자체를 이해하려고합니다.

도움 및 팁 매우 높이 평가!

편집 : 허용하고 그 쿼리 내 색인화 구현을 최적화 할 쿼리하는에 대해, 여기에 요점이다

그래서 정말 생각해야 할 것? 기본적으로 고객을 한 번 저장 한 다음 해당 고객을 위해 많은 주문을 한 다음 해당 고객을 위해 작은 파일 (선호하는 pdfs)을 업로드 할 수 있어야합니다. 각 주문마다 꼭 필요한 것은 아닙니다 (구현하기 쉽지만 그렇게 할 수도 있음). 그것) ... 나는 모든 고객을 별도의 엔티티로 본다. "나는 xy를 주문한 모든 고객에게 나에게 줄 것을"좋아하지 않는다. 나는 한 번 고객을 한 명씩 만 갖고 고객 및 모든 파일에 대한 모든 주문을 저장할 필요가있다. . 나는 가고 싶다 : XY의 이름으로 고객을 검색한다. 그러면 모든 주문 및 날짜 목록과 해당 고객을 위해 업로드 된 파일 목록 (주문과 관련이있을 수 있음)이 표시된다.

답변

2

이 질문은 대답하기에 너무 광범위합니다. 그럼에도 불구하고 SQL에서 No-SQL (indexedDB)으로 전환 할 때 배우는 주요 개념은 객체 저장소의 개념입니다. 대부분의 SQL 데이터베이스는 관계형이며 쿼리를 최적화하는 많은 작업을 수행합니다. indexedDB는 그렇지 않습니다. 따라서 정규화와 비정규 화의 개념은 조금 다르게 작동합니다. 초점은 명시 적으로 자신의 쿼리를 계획하는 것입니다. 나중 시점에 설계되고 나중에 쉽게 추가/변경되는 간단한 임시 SQL 쿼리를 허용하는 앱/시스템의 설계와는 달리, 실제로 많은 계획을 세워야합니다 indexedDB 용.

그래서 전환은 단순히 3 개의 관계형 테이블에 해당하는 3 개의 객체 저장소를 만드는 문제라고 말하는 것은 안전하지 않습니다. 하나는 indexedDB에 가입하는 개념이 없으므로 외래 키를 조인 할 수 없습니다.

귀하의 질문에 분명하지 않지만 귀하의 3 테이블은 고객, 주문 및 파일입니다. 나는 여기서 사지에 나가서 추측을 할 것이다. 나는 당신이 클라이언트 하나의 객체 저장소를 사용할 수있을 것이라고 확신한다. 그런 다음 각 클라이언트 개체에 대해 일반 클라이언트 속성을 저장하고 orders 배열 속성을 저장하고 files 배열 속성을 저장합니다. orders 배열에서 주문 개체를 저장합니다.

파일이 바이너리 인 경우 작동하지 않습니다. 블롭을 사용해야하고 다양한 브라우저의 indexedDB 구현에서 블롭 지원과 관련된 문제가 발생할 수 있습니다 (Chrome에서 지원됨, 버전 간 버전이 명확하지 않음).).

일반적인 쿼리 계획에서는 가장 자주 사용되는 쿼리 유형 인 클라이언트 주문을 나열해야한다고 가정합니다.

주문간에 어떤 일을해야 할 때 주문이 속한 클라이언트와 관계없이 이렇게하면 잘 작동하지 않으며 전체 매장을 반복해야합니다.

clients-orders 관계가 여러 개일 경우 클라이언트 당 주문 정보를 중복 저장해야하므로 잘 수행되지 않습니다.그러나 여기에서 주목할 점은 indexedDB와 같은 NoSQL 스타일 데이터베이스에서이 중복 저장 영역이 매우 일반적이라는 것입니다. 목표는 데이터를 완벽하게 모델링하는 것이 아니라 자주 발생하는 쿼리를 (정확성을 유지하면서) 신속하게 완료 할 수있는 방식으로 데이터를 저장하는 것입니다.

편집 :

당신의 편집을 바탕으로, 나는 세 가지 객체 저장소를 사용하는 간단한 프로토 타입을 제안합니다. 클라이언트 세부 정보를 표시하는 클라이언트보기 페이지에서 세 가지 별도의 쿼리를 실행하기 만하면됩니다.

  1. 클라이언트 ID를 기반으로 클라이언트 객체 저장소에서 하나의 엔티티를 가져옵니다.
  2. 주문에 커서를 놓고 클라이언트의 모든 주문을받습니다. 주문 상점에서 client-id 특성을 사용하십시오. 이 client-id 특성에 색인을 작성하십시오. 특정 클라이언트 ID에 대한 색인 위로 커서를 이동하십시오.
  3. # 2와 비슷한 전술을 사용하여 파일 저장소에 커서를 놓습니다.

bizlogic 계층에서 데이터 제약 조건을 적용하십시오. 예를 들어 클라이언트를 삭제할 때는 먼저 파일 저장소에서 모든 파일을 삭제 한 다음 주문 저장소에서 모든 주문을 삭제 한 다음 클라이언트 저장소에서 단일 클라이언트 엔티티를 삭제하십시오.

나는 그것을 과장하지 않는 것이 좋습니다. 그것은 그렇게 복잡하지 않습니다. 지금까지 성능 문제가있는 것처럼 들리므로 무언가를 더 우아하게 만들 필요가 없습니다.

+1

이 답변에 감사드립니다. 내 대답이 너무 길어서 질문을 편집했습니다. – user3629892

+1

훌륭하고 고맙습니다. 나는 그것을 코드에 적용하려고 노력할 것이다. 다시 한번 고마워! – user3629892

관련 문제