2010-01-21 4 views
0

나는이 문제에 몇 번 부딪 쳤고 다른 사람들이 무엇을하고 있는지 궁금합니다.가져온 데이터와 함께 보조 데이터를 저장하기위한 전략

데이터베이스를 만들 때 데이터를 테이블에 정기적으로 가져와야하는 경우가 있습니다. 내가 일반적으로하는 일은 모든 레코드를 삭제하고 외부 데이터 소스의 모든 레코드를 다시 가져 오는 것입니다.

여러 번 가져온 레코드와 관련된 데이터를 저장해야하지만 원래 가져 오기 원본에서 가져온 데이터는 저장해야합니다. 일반적으로이 "추가 데이터"는 사용자 입력에서 나옵니다. 따라서 가져온 데이터를 가져 오는 테이블의 키와 일치하는 기본 키가있는 다른 테이블을 만들고이 추가 데이터를 새 테이블에 저장합니다. 여기서 의미가 없으면 예제가 있습니다.

기존 시스템에는 직원 데이터가 저장됩니다. 그러나이 오래된 레거시 시스템에 연결할 수없는 웹 응용 프로그램에서이 데이터를 사용해야합니다. 그래서, 나는 오래된 시스템에있는 데이터의 스키마와 일치하는 테이블을 가지고 데이터베이스를 만들고 매일이 테이블에 각 레코드를 가져옵니다. 가져 오기를 수행 할 때 모든 레코드를 삭제하고 모든 레코드를 가져옵니다.

그러나 새 시스템에서는 직원이 바이오를 저장할 수 있습니다. 그래서 다른 테이블에서 나는이 ID와 이드를 저장합니다.

하나의 테이블 만 가지는 것이 더 간단 할 수 있지만 가져 오기를 수행 할 때 다른 위치에 존재하지 않는 데이터를 삭제할 수 있기 때문에 그렇게 할 수 없습니다.

또 다른 나쁜 점은 가져 오기를 위해 이러한 모든 레코드를 삭제하기 때문에 관련 데이터로 외래 키 제약 조건을 정의 할 수 없다는 것입니다.

나는 더 좋은 방법이 있다는 것을 알고 있기 때문에 이러한 방식으로 데이터베이스를 설계하는 것이 싫다. 데이터를 가져 와서 삭제하고 가져 오기 대신 업데이트 할 수 있다면 좋지 않겠습니까?

SQL Server 2008을 사용하고 있지만 RDBMS와 함께 사용할 수있는 전략에 관심이 있습니다.

답변

2

글쎄, 가져 오기를 수행 할 때 임시 테이블로 가져온 다음 프로덕션 테이블의 레코드를 업데이트하십시오 (단어의 일반적인 의미로 업데이트 : 삭제 된 항목 삭제, 새로운 내용 추가, 변경된 내용 수정).

2008 년 새로운 MERGE SQL 명령을 확인하고 싶을 수도 있습니다.이 경우에는 매우 도움이 될 수 있습니다.

MERGE INTO dbo.Sections as S  -- Target 
USING dbo.SectionsStaging as SS  -- Source 
ON S.Id = SS.Id      -- Join 
WHEN MATCHED THEN     -- Record exists in both tables 
    UPDATE SET 
     TermCode = SS.TermCode, 
     CourseTitle = SS.CourseTitle, 
     CoursePrefix = SS.CoursePrefix, 
     CourseNumber = SS.CourseNumber, 
     SectionNumber = SS.SectionNumber, 
     Capacity = SS.Capacity, 
     Campus = SS.Campus, 
     FacultyFirstName = SS.FacultyFirstName, 
     FacultyLastName = SS.FacultyLastName, 
     [Status] = SS.[Status], 
     Enrollment = SS.Enrollment 
WHEN NOT MATCHED THEN    -- Record exists only in source table 
    INSERT ([Id],[TermCode],[CourseTitle],[CoursePrefix],[CourseNumber],[SectionNumber],[Capacity],[Campus],[FacultyFirstName],[FacultyLastName],[Status],[Enrollment]) 
    VALUES (SS.[Id],SS.[TermCode],SS.[CourseTitle],SS.[CoursePrefix],SS.[CourseNumber],SS.[SectionNumber],SS.[Capacity],SS.[Campus],SS.[FacultyFirstName],SS.[FacultyLastName],SS.[Status],SS.[Enrollment]) 
WHEN NOT MATCHED BY SOURCE THEN  -- Record exists only in target table 
    DELETE; 

좋은 물건 :

+0

이것은 내가 찾고있는 것입니다. 감사. –

0

여기에 내 현재 상황 좀 도와 함께 온 SQL 서버 2008 병합 문입니다!

+0

2 년 후이 작업을 수행하는 방법을 생각 나게 해 주셔서 감사합니다! –

관련 문제