2011-09-15 6 views
1

다소 단순화하기 위해 ... 사용자 EAV 데이터의 역사, 특히 주소를 가리키는 곳을 원합니다. 그러나 중복을 제거하는 것은 까다로울 수 있습니다.EAV 주소 기록을 데이터베이스에 어떻게 저장해야합니까?

주소에는 고유 한 테이블이 있습니다.

사용자는 users 테이블과 다른 엔티티 테이블의 표준 데이터 외에도 홀수 데이터를로드합니다. 이 이상한 사용자 데이터를 EAV 테이블에 넣을 계획이었습니다. 이 사용자 EAV 데이터는 주소 테이블에 저장된 주소를 가리키는 여러 항목을 포함 할 수도 있습니다.

변경 내역을 기록하고 싶습니다.

따라서 사용자의 주소가 일어날 필요가있다처럼 보이는 변경할 때이다 :

  • 새로운 주소는 주소 테이블에 추가됩니다.
  • 이전 주소 행을 가리키는 대신 이전 EAV 항목이 주소 테이블의 새 행을 가리 키도록 업데이트됩니다.
  • EAV 행에 대한 변경은 많은 일처럼 보이지 않는 솔직히

(트리거를 사용합니다)를 EAV 기록 테이블에 기록되어 있지만 :

  • 해야하는 이전 주소 테이블의 항목은 영원히 읽기 전용으로 유지됩니다. (예, 내 추측은 그렇습니다. 이전 기록은웨어 하우징 고려 사항이지만, 그렇게 보이는 것은 ... icky입니다.)
  • 어떻게 이러한 주소 항목을 최소한 재사용 할 수 있습니까?

그것은 모두가 그렇게 더러운 것, 그리고뿐만 아니라 EAV (아마도 새로운 사용자 입력에 일치하는 기존 항목 제공하여) 당신은 사람의 주소의 역사를 추적하려는 경우, EAV 월)

답변

1

을 "우아한"솔루션에 조금 있어야합니다. EAV에 따르면 주소가 필드로 나누어지고 각 필드가 특성이라는 것을 의미합니다. 따라서 누군가가 이사를하면 같은 도시에 머물러 있지만 주소는 변경되지만 도시, 주 및 우편 번호는 동일하게 유지됩니다.

사람들은 항상 움직입니다. 나는 통계를 잊어 버렸지 만 매년 16 % 또는 18 %의 사람들이 이사를 다니고 있습니다. 사람들의 주소에 대한 감사 내역이있는 비즈니스 이유가 있습니다.

주소 기록을 추적하는 경우 스냅 숏 기반 기록 테이블을 유지하고 트리거를 사용하여 해당 테이블을 채우는 것이 좋습니다. 다음과 같은 스키마를 사용할 수 있습니다.

ADDRESS_HISTORY 
    person_key int 
, change_date datetime 
, address_1 nvarchar(50) 
, address_2 nvarchar(50) null 
, city  nvarchar(30) 
, state  nvarchar(2) 
, zip   nvarchar(10) 
, primary key (person_key, change_date) 

물론 스키마는 사용자 고유의 주소 속성 구조를 미러링해야합니다.

이것은 우아한 재사용은 없지만 그러한 재사용이 자연 스럽 게 발생한다는 것과 혼돈을 피할 수 있습니다. 각 주소의 전체 스냅 샷을 유지하는 데는 약간의 여유 공간이 필요하지만 실제 사용 기록을 훨씬 쉽게 만들 수 있습니다.

+0

. EAV는 주소로 잘 알려진 것처럼 최악의 구조에 사용됩니다. –

+0

죄송합니다. 아마도 약간의 오해가있을 것입니다. (제 질문을 좀 더 구체적으로 수정했습니다).주소는 이미 테이블에 있습니다. 하지만 주소 인스턴스는 일종의 홀수 데이터 (선택적 및 다소 드문)이므로 참조가 EAV 테이블에 저장됩니다. 은 다음과 같습니다 : -><사용자 eav 테이블 (단일 행 참조)> -><주소 테이블> –

+0

죄송합니다. 처음에는 당신을 따라 가지 않았습니다. 고객과 관련이있는 EAV 데이터가 해당 고객에 속한 주소와 관련이 있다면 올바른 경로 일 수도 있고 그렇지 않을 수도 있습니다. EAV 데이터가 주소에 어떤 방식으로 의존하는지에 달려 있습니다. 힘든 의존성인가, 부드러운 것입니까? 당신이 나를 따라 간다면 그것은 "고객의 청구 지 주소"또는 "우리가 그 청구서를 보낸 실제 장소"를 의미합니까? 진정으로 "칙칙한"부분은 이전 데이터를 제거합니다. 참조 무결성을 유지하려고하면 꽤 추해집니다. 그렇지 않으면 아마 옳은 길을 가고있을 것입니다. –

관련 문제