2012-11-28 4 views
1

이 질문은 코드에 대한 아키텍처와 아이디어에 대해 자세히 설명합니다.PK/FK 용 시간별 동기화, 분산 데이터베이스 용 솔루션/디자인

문제 : 모든 것을 저장하는 백엔드 기본 DB가 있습니다. 그런 다음 사용자/장치에 대한 관련 데이터 만 저장하는 프론트 엔드 로컬 데이터베이스 (SQLLite 또는 유사)가 있습니다.

사용자는 프론트 엔드에서 데이터를 생성 할 수 있습니다. 그러나 여러 사용자가 같은 종류 (예 : 영수증)를 동시에 만들 수 있으며 간단한 int autoincrement PK를 사용하면 백엔드에서 충돌이 발생합니다.

제안 된 솔루션입니다 : 우리는 PK가 구성되어 복합 PK, 사용 :에, 논리적으로는의 DeviceID 및 사용자 ID는 FK해야 이제 -autoincrement 정수 -device의 ID - 사용자 ID

을 장치 및 사용자의 테이블, 그러나 몇 가지 이유로, 각 프런트 엔드 장치에 모든 장치/사용자를 저장할 수 없으므로 FK가 문제가됩니다.

제안 된 솔루션은 프론트 엔드에서 FK req를 제거하고 백엔드에서만 데이터 무결성을 확인하는 것이지만 위험/이득이 그만한 가치가 있는지는 잘 모르겠습니다.

누가 배포 한 후에이 시점에 도달했거나 경험이 있습니까? 당신의 생각은 무엇입니까? 대단히 감사합니다.

답변

0

블라드,

난 당신이 주소로하려고하는 어려운 문제가 생각 : 어떻게 장치는 모든 장치에서 고유 식별자를 생성 할 수 있습니까? 그 질문에 대한 과거의 대답은 "장치 ID", "타임 스탬프"및 난수와 같이 고유하게 식별되는 정보를 통합하는 "글로벌 고유 ID"(GUID) 또는 "UUID (Universally Unique IDentifier)"를 만드는 것이 었습니다 . 이와 같은 작업을 수행하는 IETF 표준은 RFC4122입니다.

따라서 대부분의 데이터베이스 공급 업체는 이러한 고유 식별자 중 하나를 반환하기 위해 적어도 UUID() 또는 GUID() SQL 함수를 제공합니다. BTW, 난 SQLLite 하나를 제공하는지 모르겠지만, 나는 SequelSphereDB UUID() 함수를 제공하지 않습니다 알아요. 최종 결과는 이들을 사용하여 행에 대한 고유 식별자를 작성할 수 있다는 것입니다.

따라서 숫자, 장치 ID 및 사용자 ID로 구성된 조합 기본 키 대신에 행의 시간에 즉석에서 생성 된 UUID를 저장하는 단일 열 CHAR (36)이 있습니다 창조.

UUID의 장점 :

  • 단일 열
  • 필요없이 클라이언트에서 생성 된
  • 적어도 훨씬 더 때문에 대체 가능성보다는 고유해야 "보장", 또는 다른 장치에게 문의하십시오.

UUID의 단점 :

  • 열 저장이 큰 : CHAR (38).
  • 대리 키 원 - 업 제너레이터와 비교하여 생성 속도가 느립니다.
+1

SQLite는 UUID 또는 GUID 기능을 제공하지 않지만 대부분의 프로그래밍 언어는 이제 수행합니다. 따라서 응용 프로그램 코드에서 GUID를 생성 한 다음 SQLite 데이터베이스에 저장할 수 있습니다. 당신은 * C에서 함수를 만들어서 SQLite로 컴파일 할 수 있지만, 보통 그것이 가치있는 것보다 더 많은 문제가 있다고 생각합니다. –

+0

알아두면 좋을 것 같습니다. 감사! –