동의어를 사용하여 중복 테이블을 만들지 않는 것이 좋습니다.


13

정확히 같은 데이터베이스의 사본 3 개가 있습니다. 3 개의 데이터베이스 모두에 Users테이블이 있으며 사용자는 항상 동일한 설정으로 3 개의 데이터베이스 모두에 존재합니다. 사용자를 추가하거나 편집 할 때마다 3 개의 데이터베이스를 업데이트해야합니다.

Users데이터베이스 2 및 3에서 테이블 을 삭제하고 Synonym데이터베이스 1을 가리키는 테이블로 바꾸는 것이 더 좋은 아이디어 입니까?

내가 생각할 수있는 장단점은 다음과 같습니다.

찬성

  • 더 쉬운 정비. 3 대신 한 위치에서 사용자를 업데이트 할 수 있습니다
  • 사용자 ID는 데이터베이스간에 일치합니다 (많은 애드온 앱이 UserId를 기반으로하기 때문에 중요합니다)

단점

  • 이것이 표준 절차라고 생각하지 않으므로 혼란 스러울 수 있습니다.
  • 사용자는 데이터베이스간에 동일한 설정을 가져야합니다
  • ( 아래 의 gbn의 답변에서 ) 데이터베이스 1이 다운되면 데이터베이스 2 및 3도 사용할 수 없습니다. 또한 복원시 데이터가 일치하지 않을 수있는 잠재적 인 문제가 있습니다.

이것은 테이블뿐만 아니라 데이터베이스간에 동일한 설정을 포함하는 몇 가지 다른 테이블에 대해 고려중인 옵션 Users입니다. 이해하기 쉽기 때문에 예제에서 Users를 사용하고 있습니다.


3
차이점을 동기화 / 병합하는 스크립트를 만드는 것이 더 합리적입니까? 나는 개인적으로 이와 같은 동의어 때문에 2 개의 데이터베이스가 3 개의 데이터베이스에 의존하는 것을 좋아하지 않습니다.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner 훨씬 더 많은 작업처럼 보이며 기본 키와 같은 자동 생성 필드에 변경 사항을 병합하기가 어렵습니다.
Rachel

얼마나 공상을 원하는지에 따라 다릅니다. 변경 사항을 공유하려면 복잡 할 수 있습니다. 하나를 마스터로 지정하려면 단순히 다른 사람의 내용을 마스터의 내용으로 덮어 쓰는 것입니다.
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner 불행히도 응용 프로그램은 비공개이며 사람들이 데이터베이스에서 사용자를 추가하거나 편집하는 것을 막을 수있는 것은 없습니다. 모든 사람이 자신의 암호를 변경할 수 있고 거의 모든 관리자가 사용자 관리에 액세스하여 사용자를 추가 / 편집 할 수 있으므로 양방향으로 변경해야합니다.
Rachel

답변:


6

동일한 사용자를 가진 3 개의 데이터베이스가있는 이유는 무엇입니까?

하나의 데이터베이스가 다운되면 어떻게됩니까?

다른 두 데이터베이스의 사용을 방해하는 사용자 소스 데이터베이스의 단점이 들리는 것처럼 큰 문제는 아닐 수 있기 때문에 이러한 질문을하고 있습니다.

또한 데이터베이스가 다운되면 해당 기간 동안 다른 두 DB에서 사용자를 수정하면 일관성 문제가 발생합니다. 나는 우리가 더 많은 상황없이 최선의 조언을 줄 수 있다고 생각하지 않습니다.

지금은 사용자를위한 네 번째 데이터베이스를 만들고 거기에서만 변경하고 다른 데이터베이스와 동기화합니다. 기본적으로 동일한 데이터를 세 곳에서 변경하여 이미 비정규 화되어 있으며 아마도 일관성 문제가있을 수 있습니다. 내결함성이 중요한 경우이 체계는 여전히 다중 입력 문제를 해결하면서이를 제공합니다.

기존 데이터베이스 중 하나를 사용하는 대신이 네 번째 사용자 / 설정 전용 데이터베이스를 사용하는 것이 좋은 전략이라고 생각합니다. 다른 리소스에 묶여 있거나 많이 사용되지 않기 때문에 다운 될 가능성이 적기 때문입니다. 나는 당신이 당신이 이것을 할 수 없다고 말한 것을 알지만, 왜 그런지는 확실하지 않습니다. 기본 데이터베이스의 응용 프로그램이 사용자 편집을 직접 지원합니까, 아니면 사용자가 다른 곳을 가리킬 수있는 완전히 별개의 기능을 편집하고 있습니까?

사실, 동의어를 사용하든 데이터를 동기화하든이 "정식 사용자 테이블"아이디어를 사용하면 다운 사용자 DB 중에는 사용자를 수정할 수 없지만 괜찮습니다. 문제를 해결하고 제기하십시오! 하나의 소스, 하나의 편집 장소, 깨진 경우 고칠 것. 동기화를 사용하면 다른 모든 데이터베이스에는 작업 할 수있는 임시 복사본이 있지만 편집 할 수는 없습니다. 시스템 전체에서 데이터 복제를 최소화하는 것이 훌륭하고 유용한 목표입니다. 세 곳에서 동일한 데이터를 입력하는 것은 심각한 문제이므로이를 제거하기 위해 가능한 모든 조치를 취하십시오.

더 많은 의견을 처리하려면 모든 응용 프로그램에서 사용자 ID가 다른 경우 두 개의 새 데이터베이스가 기본 데이터베이스와 동기화되도록 계획된 다운 시간을 신중하게 고려해야합니다 (아이디어가 필요한 경우 별도의 질문을하십시오) 이것을 달성하는 방법에 대해, 까다 롭지 만 실제로 그렇게 어렵지는 않습니다).

비즈니스 요구 사항을 분석하고 주 데이터베이스에 사용자 데이터가 올바른지 확인해야하는 경우에도 여전히 정식 데이터로 사용하고 동의어 또는 동기화 중에서 선택하여 계획되지 않은 중단 시간이 모든 데이터베이스에 미치는 영향을 해결하십시오.

동의어 사용의 또 다른 단점은 더 이상 각 데이터베이스의 사용자에게 적절한 FK를 가질 수 없다는 것입니다.


3

누락 된 "Con"

복원시, 사용자가 동의어의 대상 데이터베이스에 존재하지 않을 수 있습니다. 손상되었다고 말하면 백업에서 복원해야합니다.

즉, 동의어를 사용하면 실제 데이터베이스에서는 참조 할 수없는 데이터베이스 간 참조 무결성을 가정하게됩니다.

이것의 또 다른 결과는 이것을 복구하려고 할 때 일치하지 않는 사용자 ID입니다. (복원 후 사용자를 추가하여). 그러나 이것은 내가 언급 한 데이터베이스 간 참조 무결성으로 인해 절대 가정해서는 안됩니다.

그러지 마 ..

dba.se에 대한 관련 답변 : 복원 후 "데이터베이스 간 참조 무결성"에 대한 비 dbo 스키마 사용 시점과 새 데이터베이스 사용시기 결정 기준


링크가 왜이 질문과 관련이 있는지 알아 내려고 노력하고 있지만 목표가 존재하지 않을 가능성에 대한 좋은 지적
Rachel

1
@Rachel : 아니요, 대상 테이블이 존재할 수 있지만 데이터가 더 오래되었을 수 있습니다. 따라서 복원 할 때 누락 된 사용자가 있습니다. 링크는 "데이터베이스 간 참조 무결성"에 관한 것입니다.
gbn

2

데이터베이스 플랫폼에 따라 다른 옵션은 데이터베이스 2 및 3에서 테이블을 삭제하고 데이터베이스 1에서 테이블의 구체화 된보기 로 바꾸는 것입니다 .

찬성

  • 손쉬운 유지 보수 (데이터)
  • 일치하는 ID
  • 중단은 다른 데이터베이스에 영향을 미치지 않습니다 (적어도 변경이 필요할 때까지)
  • 모든 데이터베이스를 사용하여 테이블을 복구 할 수 있습니다.

단점

  • 데이터는 새로 고침 일정만큼 최신입니다.
  • 테이블 정의가 변경되면 구체화 된보기도 변경해야합니다.

또한 조회 빈도, 새로 고침 빈도 및 데이터 변경 빈도에 따라 동의어 솔루션보다 더 많은로드가 발생하거나 발생하지 않을 수 있습니다.


업데이트 : FrustratedWithFormsDesigner의 의견은 본질적으로 구체화 된 뷰를 수행 할 수없는 플랫폼을위한 구체화 된 뷰입니다. 스크립트를 사용하여 테이블을 주기적으로 동기화 할 수 있습니다. 하나의 데이터베이스가 마스터로 지정된 경우 모든 스크립트가이를 기반으로 변경을 수행 할 수 있습니다. 이것은 구체화 된 관점의 모든 장단점이 있습니다. 내장 기능을 이용할 수 없었습니다.


1
SQL Server에서 DB 간 뷰 (인덱싱 된 뷰) 크로스 DB를 구체화 할 수 없으며 새로 고칠 필요가 없습니다. "실시간"
gbn

@gbn 내 게시물은 SQL Server 태그가 추가되기 전에 작성되었습니다.
레이 리펠

답변에 따라 태그를 추가했습니다 :)
Rachel

1

공유 된 사용자 정보를 저장하는 4 번째 DB를 만듭니다. 사용자 DB를 가리키는 각 기타 Dbs를 작성 Synonyms하거나 작성하십시오 Views.

마지막으로 해당 앱과 관련된 사용자 데이터를 보유하는 3 개의 기존 데이터베이스 각각에 확장 테이블 ( 'UserDB.Usertable'과 일대일 관계가있는 테이블)을 만듭니다.


편집 : 아래 의견을 바탕으로

이 경우 첫 번째 db를 마스터 사용자 테이블로 사용하십시오. Synonyms및 기타 Dbs 각각의 확장 테이블.

중요 사항 :이 방법을 사용하면 첫 번째 앱이 다운되면 다른 두 앱이 다운됩니다! 모든 사람이이 단점을 이해하도록하십시오.


슬프게도 그것은 나를위한 옵션이 아닙니다. 처음부터 무언가를 디자인하는 경우 선호되는 옵션이지만이 경우 기존 시스템으로 작업하고 있습니다. 필자의 경우 데이터베이스 1은 수년 동안 존재했으며 최근 데이터베이스 2와 3을 추가했습니다.
Rachel

테이블을 삭제하고 동의어가 첫 번째 db를 가리키고 새 db를 가리킬 수없는 이유는 무엇입니까?

죄송합니다. 댓글을보기 전에 댓글을 수정했습니다. 데이터베이스 1은 수년 동안 존재 해 왔으며 많은 외부 앱에서 액세스합니다. 해당 테이블을 제거하여 어떤 종류의 손상이 발생했는지 확실하지 않습니다. 데이터베이스 2와 3은 최신 버전이므로 Users 테이블 (및 기타 설정 테이블)을 제거하고 동의어로 바꾸면됩니다.
Rachel

편집 내용을 볼 수 있습니다 ... 정확히 내가하려고하는 일이지만 내 질문은 이것이 좋은 생각인지 아닌지, 그렇지 않은 이유는 무엇입니까?
Rachel

괜찮아. 두 개의 뉴스 앱을 첫 번째 앱에 완전히 의존하게 만드는 것이 좋습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.