조언 please : SQL Server Identity vs Entity Framework를 사용할 때 고유 식별자 키
-
03-07-2019 - |
문제
저는 상당히 복잡한 시스템을 설계하는 과정에 있습니다. 우리의 주요 관심사 중 하나는 SQL Server 피어 투 피어 복제를 지원하는 것입니다. 아이디어는 여러 지리적으로 분리 된 노드를 지원하는 것입니다.
이차적 인 관심사는 중간 계층에서 현대 ORM을 사용하는 것입니다. 우리의 첫 번째 선택은 항상 엔티티 프레임 워크였습니다. 주로 개발자가 작업하기를 좋아하기 때문입니다. (그들은 LINQ 지원을 좋아합니다.)
여기에 문제가 있습니다.
피어 투 피어 복제를 염두에두고 모든 테이블의 기본 키에 대해 NewSeventient ()의 기본 값을 가진 고유 한 식별기를 사용하는 데 정착했습니다. 이것은 주요 충돌을 피하고 인덱스 조각화를 줄이는 것 사이의 균형을 잘 제공하는 것처럼 보였다.
그러나 현재 버전의 엔티티 프레임 워크에는 매우 이상한 한계: 엔티티의 키 열이 고유 한 식별기 (Guid) 인 경우 데이터베이스에서 제공 한 기본값 (newSeventientiid ())를 사용하도록 구성 할 수 없습니다. 응용 프로그램 계층은 안내서를 생성하고 키 값을 채워야합니다.
그래서 여기에 토론이 있습니다.
- 엔티티 프레임 워크를 포기하고 다른 ORM을 사용하십시오.
- nhibernate를 사용하고 LINQ 지원을 포기하십시오
- LINQ2SQL을 사용하고 향후 지원을 포기하십시오 (DB에서 SQL Server에 바인딩되는 것은 말할 것도 없습니다).
- 지도를 포기하고 다른 PK 전략을 가지고 가십시오
- 애플리케이션 계층에서 순차 안내 (COMBS?)를 생성하는 방법을 고안합니다.
나는 LINQ2SQL (내 개발자가 LINQ2 [stuff]를 정말 좋아합니다)와 3으로 옵션 1에 기대고 있습니다. 주로, 우리가 목표로하는 복제 체계를 지원하는 대체 주요 전략을 다소 무지하기 때문입니다. 개발자의 관점.
모든 통찰력이나 의견은 크게 감사 할 것입니다.
해결책
다른 옵션 (게시 될 때 사용할 수 없음)은 서버 생성 GUING을 지원하는 EF 4로 업그레이드하는 것입니다.
다른 팁
두 번째 크레이그의 제안 - 옵션 4.
중간 계층으로 채워진 Guid 열을 기본 키 (논리적 구성)로 사용할 수 있습니다.
대규모 인덱스 (따라서 : 테이블) 조각화를 피하려면 다른 키 (이상적으로 INT ID 열)를 클러스터링 키로 사용하십시오. 이는 기본 키에서 분리 될 수있는 물리적 데이터베이스 구성입니다.
기본적으로 기본 키는 클러스터링 키입니다. 그러나 그렇게 할 필요는 없습니다. 실제로, 나는 데이터베이스 I "상속" - int Identity 열을 추가하고 클러스터링 키를 작고 계속 변화하지 않는 int에 클러스터링 키를 넣어 성능을 향상시키고 단편화를 크게 낮 춥니 다!
마크
뭐? 나는 당신의 세 가지 옵션이 잘못된 선택이라고 생각합니다. 옵션 4를 고려하십시오 :
4) 엔티티 프레임 워크를 사용하십시오 비 순위, 클라이언트 생성 안내서.
EF는 DB-Server 생성 안내서를 볼 수 없습니다 프레임 워크 자체에 의해 삽입 된 새 행의 경우, 물론 DB 서버에서 안내를 생성 할 필요는 없습니다. 엔티티 인스턴스를 만들 때 클라이언트에서이를 생성 할 수 있습니다. 지도의 요점은 당신이 그것을 어디에서 생성하는지는 중요하지 않다는 것입니다. 복제 된 DB에 의해 생성 된지도에 관해서는 EF는 그것들을 잘 볼 수 있습니다.
클라이언트 측 그 안내서는 순차적이지 않지만 (Guid.NewGuid () 사용)는 전 세계적으로 고유하게 보장됩니다.
우리는 배송, 생산 소프트웨어에서 복제를 통해이를 수행합니다. 그것 하다 일하다.
왜 신원 열을 사용하지 않습니까? 병합 복제를 수행하는 경우 각 시스템이 별도의 시드에서 시작하고 한 방향으로 작업 할 수 있습니다 (예 : 노드 A는 1에서 시작하고 1을 추가하고 노드 B가 0에서 시작하고 1을 빼냅니다) ...
실제로 NewSeventient ()를 사용하는 경우 저장된 절차를 사용할 수 있습니다. 결과 열을 절차에서 적절한 속성에 바인딩 할 수 있으며 일단 삽입되면 SQL 생성 GUID가 객체에 공급됩니다.
불행히도 다른 작업이 기본값을 사용하여 올바르게 완료 되더라도 세 가지 작업 (삽입, 업데이트, 삭제)에 대해 SPS를 정의해야합니다. 또한 SP 코드를 유지하고 변경할 때 EF 모델과 동기화되어 있는지 확인해야하므로 추가 오버 헤드로 인해이 옵션을 매력적으로 만들 수 있습니다.
단계별 예제가 있습니다 http://blogs.msdn.com/bags/archive/2009/03/12/entity-framework-modeling-actored-procedures.aspx 꽤 간단합니다.
linq와 함께 자신의 ORM (그다지 어렵지 않음)과 함께 NewSeqid를 사용하십시오.