2009-04-11 5 views
7

저는 직원 급여의 기록과 조직 내에서의 움직임을 유지해야하는이 데이터베이스를 설계하고 있습니다. 기본적으로, 내 디자인은 3 개의 테이블을 가지고 있습니다. (더 많은 테이블이 있지만이 질문에 대해서는 3 개를 언급 할 것입니다. 직원 테이블 (가장 최근의 급여, 위치 데이터 등 포함), SalaryHistory 테이블 (급여, 날짜, 이유 등) 및 MovementHistory (직위, 부서, 설명). 나는 SQL에 Linq를 사용할 것이므로, 직원 데이터가 업데이트 될 때마다 이전 값이 각각의 히스토리 테이블에 복사 될 것이라고 생각하고있다. 좋은 접근 방법입니까? Linq를 사용하여 SQL 또는 트리거를 사용해야합니까? 도움, 제안 또는 아이디어를 보내 주셔서 감사합니다.데이터베이스의 내역을 유지 관리합니다.

답변

8

http://www.simple-talk.com/sql/database-administration/database-design-a-point-in-time-architecture을 살펴보십시오.

기본적으로 문서에서는 당신이 기록을 추적하는 데 필요한 테이블에서 다음 열이 제안 -

* DateCreated – the actual date on which the given row was inserted. 
* DateEffective – the date on which the given row became effective. 
* DateEnd – the date on which the given row ceased to be effective. 
* DateReplaced – the date on which the given row was replaced by another row. 
* OperatorCode – the unique identifier of the person (or system) that created the row. 

함께 당신에게 행이 유효되는 시간 (또는 시간을 알려 DateEffective 및 DateEnd 직원이 부서에 있거나 특정 급여를받은 시간)

+0

흥미로운 링크 - 좋은 읽을 거리, 감사합니다! – ChristopheD

+0

멋진데, 나는 이미 날짜에 관해 비슷한 패턴을 가지고 있었다. 귀하의 게시물 주셔서 감사합니다, 매우 유용합니다! – jasonco

6

로직을 데이터베이스 내부에 유지하는 것이 좋습니다. 기본적으로 트리거가 존재하는 이유입니다. 그러나 나는 이것을 신중히 말하지만, 외부에 두어야 할 많은 이유가 있습니다. 종종 LINQ-to-SQL처럼 쉬운 기술을 사용하면 외부에서 코드를 작성하는 것이 더 쉽습니다. 내 경험상, 트리거를 사용하여 올바르게 수행 할 수있는 것보다 더 많은 사람들이 C#/LINQ에서 해당 논리를 작성할 수 있습니다.

트리거가 빠르며 컴파일됩니다. 그러나 오용을 일으키기 쉽고 성능이 급속히 저하 될 수있는 수준까지 로직을 복잡하게 만듭니다. 유스 케이스가 얼마나 단순한 지 고려하면 나는 트리거를 사용 하겠지만 개인적으로는 저를 사용합니다.

+0

귀하의 통찰력을 주셔서 감사합니다 :) – jasonco

+0

나는 이것이 내가 사용하려고하는 접근이라고 생각합니다. 나는 트리거에 대한 많은 경험이 없습니다. 내 말은, 나는 여전히 SQL에 linq을 배우고 있지만 훨씬 편안하게 느낀다. – jasonco

+0

나는 "좋은 생각"에 대해 의견을 달리하지만 생각하는 방식에는 동의하지 않습니다. 이러한 규칙은 항상 데이터베이스 클라이언트가 데이터베이스를 따르도록 보장해야합니다. DB는 외부 당사자가 아닌 자체 데이터 무결성을 보호하기 위해 자체적 인 엔터티 여야합니다. 어쨌든 +1하십시오. – paxdiablo

2

트리거가 더 빠를 가능성이 높으며 작업을 완료하는 데 "중간 인력"이 필요하지 않으므로 오류가 발생할 확률은 적어도 한 번입니다.

선택한 데이터베이스에 따라 하나의 테이블 만 사용하고 OID를 활성화하고 "플래그"및 "이전"두 개의 열을 추가 할 수 있습니다. 이 테이블을 업데이트하지 말고 삽입하십시오. 직원 #id에 행이 추가 될 때 직원 #id가있는 모든 레코드를 "old"플래그로 설정하고 새 행 "previous"값을 이전 행으로 설정하도록 트리거를 추가하십시오.

+0

귀하의 의견을 보내 주셔서 감사합니다! – jasonco

1

트리거를 사용하면 프런트 엔드를 다른 것으로 쉽게 마이그레이션 할 수 있으며 데이터 삽입/업데이트/제거 방법에 관계없이 데이터베이스의 일관성을 유지할 수 있습니다.

당신의 경우 외에 급여 기록에 곧바로 연봉을 쓸 것입니다. 귀하의 설명에서 직원 표에 업데이트 트리거를 통해 가야하는 이유를 알 수 없습니다.

+0

그게 내가 처음에는 가지고 있었지만 역사에 대한 역사 테이블을 사용하기로 결정 했어. 내 말은, 내가 할 수있는 방법이 아주 많다는 것입니다. 올바른 솔루션을 찾지 못하고 올바른 해결책이 없습니다. 안녕하세요, 귀하의 의견에 감사드립니다. – jasonco

2

나는 이것이 두 가지 이유로 데이터베이스에 속한다고 생각합니다.

먼저 중간 계층이 시작되고 있지만 데이터베이스는 영원합니다. 올해 Java EJBs, 내년 .NET. 그 다음 해. 내 경험으로는 데이터가 남아 있습니다.

둘째, 데이터베이스를 공유하는 경우 데이터 무결성을 유지하는 방법을 알기 위해 데이터베이스를 사용하는 모든 응용 프로그램에 의존해서는 안됩니다. 나는 이것을 데이터베이스 캡슐화의 예라고 생각한다. 왜 모든 고객에게 역사의 지식과 유지를 강요합니까?

+0

고마워, 나는 이것도 고려할 것이다. – jasonco