3

저는 현재 하루 중 로컬 데이터베이스에서 실행해야하는 경우가 있으며 밤에 중앙 서버에 복제되는 시스템에서 작업하고 있습니다. 이 을 모두 로컬 사이트가 주기적으로 접촉하지 않기 때문에 하나의 중앙 데이터베이스에서 모두 실행할 수 없습니다. 중앙 서버의 데이터는 이며 본사에서만을보고하기 때문에 역순으로 사이트로 다시 복제 할 필요가 없습니다.이 시나리오의 GUID/UUID? 아니면 복합 열쇠? 또는 기타

각 "사이트"에는 텍스트 기반 고유 키 (사람이 생성)가 지정됩니다. 그러나 데이터베이스 디자인에서 모든 테이블을 사이트 키를 참조하는 생각은 매력적이지 않습니다. 여기

는가 (고객의 대부분 잘 작동하는) 원격 복제에 대한 걱정없이 스키마 매우 삭감 버전의 예 : -

(I 만의 역사 테이블을 보여 드리겠습니다 이 지역 테이블은) 짧은 것을 유지 : 나는 중앙 서버에서 데이터베이스와 데이터베이스를 "병합"하기 위해 올 때까지, 괜찮

[Site] 
SiteKey [PK] (Gauranteed 100% unique across all sites text based key) 

[User] 
SiteKey [FK -> Site] 
UserID [PK] 

[Area] 
SiteKey [FK -> Site] 
AreaID [PK] 
Description 
UpdatedDtm 
UpdatedUserID [FK -> User] 

[AreaHistory] 
Site [FK -> Site] 
AreaID [FK -> Area] 
Description 
UpdatedDtm 
UpdatedUserID [FK -> User] 
AuditedDtm 

[Location] 
AreaID [FK -> Area] 
LocationID [PK] 
Description 
UpdatedDtm 
UpdatedUserID [FK -> User] 

[Sensor] 
LocationID [PK/FK -> Location] 
SensorNo [PK] 
UpdatedDtm 
UpdatedUserID [FK -> User] 

[Reading] 
LocationID [PK/FK -> Sensor] 
SensorNo [PK/FK -> Sensor] 
ReadingDtm [PK] 

. 다른 사이트에서 생성 된 ID와 데이터를 혼합하기 때문에 분명히 위치 테이블에서 충돌을 일으킬 것입니다.

나는이 문제를 생각 첫 번째 방법은이 작업을 수행하는 것이 었습니다 :

GS 짧은) :

[Location] 
SiteKey [FK -> Location, FK -> User] ** ADDED THIS 
AreaID [FK -> Area] 
LocationID [PK] 
Description 
UpdatedDtm 
UpdatedUserID [FK -> User] 

[Sensor] 
SiteKey [FK -> Location, FK -> User] ** ADDED THIS 
LocationID [PK/FK -> Location] 
SensorNo [PK] 
UpdatedDtm 
UpdatedUserID [FK -> User] 

[Reading] 
SiteKey [FK -> Sensor] ** ADDED THIS 
LocationID [PK/FK -> Sensor] 
SensorNo [PK/FK -> Sensor] 
ReadingDtm [PK] 

기본적으로 모든 테이블이 사이트에 고유 한 각 행을 만드는 SiteKey을 가져옵니다.

대안이 (어떤 장소에서 사용 UUID를)입니다 : -

[User] 
SiteKey [FK -> Site] 
UserUUID [PK] 

[Area] 
SiteKey [FK -> Site] 
AreaUUID [PK] 
Description 
UpdatedDtm 
UpdatedUserUUID [FK -> User] 

[AreaHistory] 
Site [FK -> Site] 
AreaUUID [FK -> Area] 
Description 
UpdatedDtm 
UpdatedUserUUID [FK -> User] 
AuditedDtm 

[Location] 
AreaUUID [FK -> Area] 
LocationUUID [PK] 
Description 
UpdatedDtm 
UpdatedUserUUID [FK -> User] 

[Sensor] 
LocationUUID [PK/FK -> Location] 
SensorNo [PK] 
UpdatedDtm 
UpdatedUserUUID [FK -> User] 

[Reading] 
LocationUUID [PK/FK -> Sensor] 
SensorNo [PK/FK -> Sensor] 
ReadingDtm [PK] 

이 아래로 절단 기억하지만, 문제를 보여줍니다.

내가 찾을 수있는 다른 대안이 있습니까? ID 재 매핑에 대해 생각했지만 새로운 악몽을 선사하는 것 같았습니다.

이 시나리오의 성가신 부분은이 시나리오를 사용하는 경우가 매우 적고 나머지는 많은 사이트에 서비스를 제공하는 하나의 데이터베이스에 만족한다는 것입니다. 그러나이 시나리오를 원한 클라이언트는 가장 큰 것입니다 .-)

나는 UUID를 사용할 수 있다고 생각했는데, 예외가 발생하면 모든 곳에서 예외를 만들 수 있다는 생각이 들었습니다. 그들을 사용하려고합니다.

차이가있을 경우 PostgreSQL을 사용하고 있습니다.

PS, this 토론이이 경우에 관련 될 수 있습니다. 나는 좋은 gauranteed 고유 한 SiteKey가 있다고 생각하는 또 다른 방법이 있는지 궁금해합니다.

+0

제공 한 링크를 읽은 후 추가 할 항목이 없습니다. 개인적으로 UUID 옵션을 선택했습니다. 공간과 속도는 앞으로 몇 년 안에 만 증가 할 것이며, 그것은 문제가되어서는 안됩니다. 정비는 앞으로 몇 년 안에 증가 할 것이고 그것은 커다란 문제가 될 것입니다. –

+0

사실 그 링크에는 많은 정보가 있지만, 모든 테이블의 복합 키의 일부로 사용하는 경우 고유 한 SiteKey가있는 경우에는 "나쁘지 않습니다"라는 질문에 궁금해졌습니다. – Mark

답변

2

이 시나리오에서 IMHO는 UHID를 사용하는 것이 "빠른 수정", 어쩌면 약간의 해킹 일 수 있다는 결론에 이르렀습니다. 나는 나를 위해,이 경우에, 복합 키를 사용하는 것이 더 깨끗하다는 것을 결정했다.UUID를 사용하여 각 ID에 SiteKey를 사용하는 것뿐입니다.

1

대부분의 복제 시나리오에는 GUID/UUID가 필요합니다. 나는 모든 테이블에 하나를 추가 할 것이다. 하나를 사용하여 성능에 미치는 영향과 특정 데이터베이스 백엔드에서이를 방지하는 방법에 대해 읽어보십시오.

0

당신이 말한 것을 감안할 때, 나는 GUID를 사용합니다. SQL Server에서는 좁은 증가 키에 대해 클러스터형 인덱스를 사용하는 것이 좋으며 종종 이것이 기본 키이기도하므로 일반 GUID는 증가하지 않는 특성과 관련된 문제를 유발하기 때문에 효과적이지 않습니다. 가있는 순차 GUID를 생성 NEWSEQUENTIALID() :

INT vs Unique-Identifier for ID field in database

내가 어떤 전에 또한 당신에게 창조의 타임 스탬프를 제공하는 날짜가 GUID에서 추출 할 수있는 능력을 가진 빗 ID 기술을 사용했습니다 (실제로는 GUID 대 int에 대해 이미 여분의 바이트를 사용하고 있기 때문에 반드시 자유롭지는 않습니다.)

그 논리의 일부 또는 대부분은 postgressql에 적용되지만 인덱싱 또는 클러스터/힙 구현에 대한 구체적인 내용은 직접적인 경험이 없습니다.

1

나는 또한 당신이 적어도 생각 할 수 있습니다 아웃 - 오브 - 박스 답변의 또 다른 세트를 추가 할 것입니다 : 당신이 복합 키의 일환으로 사이트를 유지하려면

  1. 을 기본 데이터 - 코드 생성, 뷰 및 업데이트 가능한 트리거 (SQL Server 이상)로 사이트 키가 노출되지 않은 업데이트 가능한 뷰를 만들 수 있습니다. 따라서 응용 프로그램 계층에서이를 숨길 수 있습니다 (응용 프로그램이 사이트를 인식하지 못한다고 가정 함).

  2. 실제로 복제하지는 않지만 데이터를보고 데이터베이스에 통합하고 사이트를보고 계층에만 제공하십시오. 물론 귀하의 스키마는 다르지만보고 용이므로 동일한 RI가 필요합니까?

  3. 보고 데이터베이스가 동일한 스키마를 가질 필요가 없을뿐만 아니라 특수보고 요구 사항에 최적화 된 데이터웨어 하우스와 같이 상당히 다른 비정규 화 스키마가있을 수 있습니다.

관련 문제