모바일 클라이언트와 서버 간의 참조 무결성 유지


21

그래서 나는 비교적 간단한 시스템을 가지고 있습니다. 모바일 클라이언트는 내가 (다른 모바일 클라이언트와 공유) 원격 SQL 서버에 동기화하고 싶은 것을 SQLite는 데이터베이스에 레코드를 작성합니다 . 따라서 전화의 sqlite 테이블에 새 레코드를 만들면 RESTful API를 통해 해당 변경 사항을 원격 서비스로 푸시합니다. 내가 겪고있는 문제 는 데이터에 충돌이 없도록 기본 키를 주문하는 방법입니다 (예 : 전화의 레코드는 서버의 완전히 다른 레코드와 동일한 기본 키를 가짐 ). "클라이언트에서 레코드를 참조하고 서버에서 동일한 레코드를 참조하는 일반적인 방법은 무엇입니까?


1
가장 중요한 아이디어는 클라이언트가 웹 서버의 캐시 역할을하며 클라이언트에서 변경 사항을 만든 다음 웹 서버로 푸시하는 것입니다.
JoeCortopassi

답변:


22

일반적인 방법은 uniqueidentifier키 (UUID 또는 GUID라고도 함)로 데이터베이스를 구성하는 것 입니다. 실제 충돌에 대한 두려움없이 두 곳에서 만들 수 있습니다.

다음으로, 모바일 앱은 새 행을 만들기 전에 서버에서 "fact"테이블을 동기화해야합니다. 새 행을 만들면 로컬에서 수행하고 다시 동기화하면 새 행이 서버에 추가됩니다. 업데이트 및 삭제에서도 동일한 작업을 수행 할 수 있습니다.

삽입물을 추적하려면 행에 생성 타임 스탬프가 필요합니다. 업데이트를 추적하려면 행에서 LastUpdate 타임 스탬프를 추적해야합니다. 삭제를 추적하려면 삭제 표시 테이블이 필요합니다.

동기화를 수행 할 때 서버와 모바일 장치 사이의 시간 오프셋을 확인해야하며 충돌을 해결하는 방법이 필요합니다. 삽입물은 별 문제가되지 않지만 (충돌해서는 안 됨) 업데이트는 충돌 할 수 있으며 삭제는 업데이트와 충돌 할 수 있습니다.

이러한 종류의 작업을 처리하기위한 프레임 워크가 있습니다 (예 : Microsoft Sync Framework) .


동기화 프레임 워크는 여전히 살아있다
Sadaquat

7

의심의 여지없이 두 사람 사이의 참조 무결성을 가질 수는 없습니다 . 특히, 사용자는 연결이 끊어졌을 때 모바일 응용 프로그램이 작동 할 것으로 기대합니까?

이에 대한 두 가지 관행이 있습니다.

하나는 클라이언트에서 "잠정"레코드를 생성 한 다음 서버와 동기화 할 때 중앙 시스템이 ID를 할당하도록하는 것입니다. 클라이언트는이를 반영하여 로컬 레코드를 업데이트 할 수 있습니다.

다른 하나는 클라이언트가 충돌없이 ID를 만들 수있는 방식으로 ID 생성을 배포한다는 것입니다.

이를 위해 UUID로 이동하십시오-v4는 충돌하지 않을 것입니다.

그렇지 않으면 고유 모바일 장치 ID를 레코드 ID에 넣는 것을 고려하십시오. 따라서 레코드 ID ${imei}-${local sequence number}는 IMEI가 고유성을 보장하는 로컬 ID 일 수 있으며 로컬 시퀀스 번호는 정상적인 순차 데이터베이스 ID 일뿐입니다.



0

작업중 인 프로젝트와 동일한 문제가 발생했습니다. 제 경우의 해결책은 remote_id라는 로컬 테이블에 추가 nullable 필드를 만드는 것이 었습니다. remote_id가 null 인 경우 로컬에서 원격 데이터베이스로 레코드를 동기화 할 때이 행은 동기화 된 적이 없으며 원격 행 ID와 일치하는 고유 ID를 리턴해야합니다.

Local Table            Remote Table

_id (used locally)
remote_id ------------- id
name      ------------- name

클라이언트 응용 프로그램에서 _id 필드로 테이블을 연결하고 원격으로 원격 id 필드를 사용하여 데이터를 가져오고 조인 등을 수행합니다.

로컬 예 :

Local Client Table       Local ClientType Table      Local ClientType
                         _id
                         remote_id  
_id -------------------- client_id
remote_id                client_type_id -------------- _id
                                                      remote_id
name                    name                          name

원격 예 :

Remote Client Table      Remote ClientType Table      Remote ClientType
id -------------------- client_id
                        client_type_id -------------- id
name                    name                          name

client_type 테이블이 로컬 또는 원격 테이블의 실제 ID와 일치하지 않을 수 있기 때문에 remote_id가 생성 될 때마다 클라이언트 응용 프로그램에 신호를 반환하므로이 시나리오와 코드에 논리가 없으면 데이터 무결성 오류가 발생합니다. 로컬 _id 필드를 업데이트하도록 요청하면 영향을받는 테이블을 업데이트하는 sqlite에서 이전에 생성 된 트리거가 실행됩니다. http://www.sqlite.org/lang_createtrigger.html

1- remote_id가 서버에서 생성됩니다

2- 클라이언트에게 신호를 반환

3- 클라이언트는 _id 필드를 업데이트하고 로컬 _id를 조인하는 로컬 테이블을 업데이트하는 트리거를 발생시킵니다.

물론 last_updated 필드를 사용하여 동기화를 돕고 중복 된 동기화를 피합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.