0

저는 Windows Mobile에서 실행되는 Compact Framework 응용 프로그램을 만들고 있습니다. 그것은 배달 드라이버에 의해 그들에게 다음 직업을 알리고 지출 등을 추적하는 데 사용됩니다. 모바일 장치 및 서버의 SQL Server에 SQL CE 데이터베이스가 있습니다. Sync Framework의 주요 성능 및 구성 문제로 어려움을 겪은 후에 WCF를 사용하여 자체 동기화 코드를 작성했습니다. 이것은 잘 작동하며 Sync Framework보다 훨씬 빠르지 만 더 빨리 처리하도록 요청 받았습니다. 이제 문제의 세부 사항을 살펴 보겠습니다. 바라기를 나는 이것을 분명히 설명 할 수있다.데이터베이스 및 응용 프로그램 디자인 - 제약 조건 제거?

동기화는 한 번에 한 테이블 씩 작동하며 단방향입니다. 업데이트는 서버에서 PDA로만 전송됩니다. 서버로 돌아가는 데이터는 완전히 다른 방식으로 처리됩니다. 먼저 서버에서 제거 된 PDA의 모든 레코드를 삭제합니다. 데이터베이스 제약 때문에 '부모'테이블에서 삭제하기 전에 '하위'테이블에서 삭제해야하므로 아래쪽에서 영안을 정리합니다. E.G. 제품 테이블에서 삭제하기 전에 송장 테이블에서 레코드를 삭제합니다.

다음으로 서버에 추가 된 PDA에 새 레코드를 추가합니다. 이 경우 먼저 부모 테이블을 업데이트하고 나중에 하위 테이블을 업데이트해야합니다.

내 상사는 배송 드라이버가 invoiceProduct 테이블 만 필요로 할 때 내 앱이 서버와 동기화 된 제품 테이블과 같은 대형 테이블을 유지한다는 사실을 좋아하지 않습니다. invoiceProduct 테이블은 송장과 제품 테이블을 함께 연결하며 제품에 대한 일부 정보를 포함합니다. 나는 그들의 데이터베이스 디자인이 정규화되지 않았고 제품 이름이 중복되어 invoiceProduct 테이블과 product 테이블에 저장되었다는 것을 의미합니다. 물론 우리 모두는 이것이 열악한 디자인이라는 것을 알고 있지만 이러한 상황에서 성능을 향상시키기 위해이 작업을 수행 한 것으로 보입니다.

분명한 해결책은 PDA 데이터베이스에서 제품 테이블을 완전히 제거하는 것입니다. 그러나 때때로 필요하기 때문에 나는 이것을 할 수 없다. 운전자는 인보이스에 신제품을 즉시 추가 할 수 있습니다. 상사는 대용량 테이블을 가끔씩 또는 제품을 추가하려고 시도 할 때 동기화 할 수 있다고 제안합니다. 이것은 현재 설계에서 작동하지 않습니다. 왜냐하면 PDA에없는 신제품을 포함하는 인보이스가 다운로드되면 데이터베이스 외부 키 오류가 발생합니다.

큰 메시지를 게시하는 것에 대해 죄송합니다. 바라건대 그것은 의미가 있습니다. 내 데이터베이스 제약 조건을 제거하고 좋은 데이터 구조를 엉망으로 만들고 싶지 않습니다. (

+0

왜 제품 테이블을 동기화 할 수 없습니까? –

+0

... 그리고 제품 테이블 (일부 열만)의 일부만 가지고있을 수 있습니까? –

답변

1

일부 아키텍처 문제가있는 것 같습니다. 클라이언트가 너무 많은 데이터를로드하여 필요하지 않은 클라이언트 - 서버 응용 프로그램이 있습니다.

데이터베이스가 클라이언트 측에 갖고있는 것을 반영하기 위해 ADO.NET (Dataset)을 사용했습니다. 데이터 세트 클래스는 메모리 CE SQL Server와 같습니다. 우리 회사는 더 큰 고객을 확보하기 시작하고 우리의 아키텍처는 모든 데이터를 처리 할만큼 빠르지 않습니다.

과거에는 다음을 수행했습니다.

  1. 가 데이터 세트에서 클라이언트 측
    • 에 대한 제약 의 "대부분"모든 자주 사용되는 데이터는 여전히이 제약 조건을 제거 :이 더 빠른 해결책 없습니다.
  2. 모든 것을 클라이언트에로드하는 대신 데이터의 하위 집합을로드하는 논리를 만듭니다. 예를 들어 모든 작업 데이터 (이전에 수행 한 작업 데이터) 대신 7 일의 작업 데이터 만로드합니다.
  3. 새로운 열을 추가하여 특정 데이터를 비정규 화합니다. 필요없는 추가 데이터를로드 할 필요가 없습니다.
  4. 특정 데이터는 클라이언트 모듈을 기반으로 필요할 때만로드됩니다.

데이터베이스 제약 조건을 SQL Server에 유지하는 한 데이터 무결성 문제가 없어야합니다. 그러나 PDA 측에서는 응용 프로그램이 제대로 실행되도록 더 많은 테스트가 필요합니다.

이미 기존 아키텍처가있는 경우 쉽게 해결할 수있는 문제는 아닙니다. 다행히도 이러한 제안이 도움이되기를 바랍니다.

+0

Dsum 제안에 감사드립니다. 좋은 아이디어가 많이 있습니다. 동기화 코드의 다른 모든 부분을 최적화하고 선택의 여지가없는 경우에만이 작업을 수행 할 것입니다. –

1

제품에 created_on 필드를 추가하고 각 pda가 마지막으로 동기화 된 시간을 추적합니다. 인보이스가 다운로드되면 if 제품이 마지막 동기화보다 최신이며 동기화가되면 PDA를 다시 동기화합니다. DB가 너무 많이 엉망이되는 것처럼 보이지 않습니까?

+0

감사 네이트 - 나쁜 제안이 아닙니다. 여전히 약간의 작업이 필요합니다. 나는 그것을 명심 할 것이다. –

관련 문제