이 질문은 대답하기에 너무 광범위합니다. 그럼에도 불구하고 SQL에서 No-SQL (indexedDB)으로 전환 할 때 배우는 주요 개념은 객체 저장소의 개념입니다. 대부분의 SQL 데이터베이스는 관계형이며 쿼리를 최적화하는 많은 작업을 수행합니다. indexedDB는 그렇지 않습니다. 따라서 정규화와 비정규 화의 개념은 조금 다르게 작동합니다. 초점은 명시 적으로 자신의 쿼리를 계획하는 것입니다. 나중 시점에 설계되고 나중에 쉽게 추가/변경되는 간단한 임시 SQL 쿼리를 허용하는 앱/시스템의 설계와는 달리, 실제로 많은 계획을 세워야합니다 indexedDB 용.
그래서 전환은 단순히 3 개의 관계형 테이블에 해당하는 3 개의 객체 저장소를 만드는 문제라고 말하는 것은 안전하지 않습니다. 하나는 indexedDB에 가입하는 개념이 없으므로 외래 키를 조인 할 수 없습니다.
귀하의 질문에 분명하지 않지만 귀하의 3 테이블은 고객, 주문 및 파일입니다. 나는 여기서 사지에 나가서 추측을 할 것이다. 나는 당신이 클라이언트 하나의 객체 저장소를 사용할 수있을 것이라고 확신한다. 그런 다음 각 클라이언트 개체에 대해 일반 클라이언트 속성을 저장하고 orders 배열 속성을 저장하고 files 배열 속성을 저장합니다. orders 배열에서 주문 개체를 저장합니다.
파일이 바이너리 인 경우 작동하지 않습니다. 블롭을 사용해야하고 다양한 브라우저의 indexedDB 구현에서 블롭 지원과 관련된 문제가 발생할 수 있습니다 (Chrome에서 지원됨, 버전 간 버전이 명확하지 않음).).
일반적인 쿼리 계획에서는 가장 자주 사용되는 쿼리 유형 인 클라이언트 주문을 나열해야한다고 가정합니다.
주문간에 어떤 일을해야 할 때 주문이 속한 클라이언트와 관계없이 이렇게하면 잘 작동하지 않으며 전체 매장을 반복해야합니다.
clients-orders 관계가 여러 개일 경우 클라이언트 당 주문 정보를 중복 저장해야하므로 잘 수행되지 않습니다.그러나 여기에서 주목할 점은 indexedDB와 같은 NoSQL 스타일 데이터베이스에서이 중복 저장 영역이 매우 일반적이라는 것입니다. 목표는 데이터를 완벽하게 모델링하는 것이 아니라 자주 발생하는 쿼리를 (정확성을 유지하면서) 신속하게 완료 할 수있는 방식으로 데이터를 저장하는 것입니다.
편집 :
이
당신의 편집을 바탕으로, 나는 세 가지 객체 저장소를 사용하는 간단한 프로토 타입을 제안합니다. 클라이언트 세부 정보를 표시하는 클라이언트보기 페이지에서 세 가지 별도의 쿼리를 실행하기 만하면됩니다.
- 클라이언트 ID를 기반으로 클라이언트 객체 저장소에서 하나의 엔티티를 가져옵니다.
- 주문에 커서를 놓고 클라이언트의 모든 주문을받습니다. 주문 상점에서 client-id 특성을 사용하십시오. 이 client-id 특성에 색인을 작성하십시오. 특정 클라이언트 ID에 대한 색인 위로 커서를 이동하십시오.
- # 2와 비슷한 전술을 사용하여 파일 저장소에 커서를 놓습니다.
bizlogic 계층에서 데이터 제약 조건을 적용하십시오. 예를 들어 클라이언트를 삭제할 때는 먼저 파일 저장소에서 모든 파일을 삭제 한 다음 주문 저장소에서 모든 주문을 삭제 한 다음 클라이언트 저장소에서 단일 클라이언트 엔티티를 삭제하십시오.
나는 그것을 과장하지 않는 것이 좋습니다. 그것은 그렇게 복잡하지 않습니다. 지금까지 성능 문제가있는 것처럼 들리므로 무언가를 더 우아하게 만들 필요가 없습니다.
이 답변에 감사드립니다. 내 대답이 너무 길어서 질문을 편집했습니다. – user3629892
훌륭하고 고맙습니다. 나는 그것을 코드에 적용하려고 노력할 것이다. 다시 한번 고마워! – user3629892