테이블에 타임 스탬프 필드를 추가하지 않으십니까? [닫은

StackOverflow https://stackoverflow.com/questions/154964

  •  03-07-2019
  •  | 
  •  

문제

많은 솔루션에서 볼 수있는 각 레코드에 대해 두 개의 추가 열 (timecreated, timelastupdated)에 관한 질문이 있습니다. 내 질문 : 더 나은 대안이 있습니까?

시나리오 : 거대한 DB (레코드가 아닌 테이블 측면에서)가 있는데, 그러면 고객이 와서 테이블의 80%에 "타임 스탬핑"을 추가하도록 요청합니다.

나는 이것이 별도의 테이블 (타임 스탬프)을 사용하여 달성 될 수 있다고 생각합니다. 이 테이블에는 명백한 타임 스탬프 열 외에도 테이블 이름 및 기본 키가 업데이트 중입니다. (여기서는 대부분의 테이블에서 int를 기본 키로 사용한다고 가정하지만 테이블 이름은 문자열이어야합니다).

이 기본 시나리오를 상상해보십시오. 우리는 두 개의 테이블을 가질 것입니다.

지불 :- (평소 기록)
타임 스탬프 :- {current timestamp} + {TABLE_UPDATED, id_of_entry_updated, timestamp_type}

이 디자인에서는 기본 결제 객체에 두 개의 "추가"열이 필요하지 않습니다 (그건 그렇고, 이제 INDEXINGING 이에 따라 ORM 솔루션으로 만들 수 있습니다. TABLE_UPDATED 그리고 id_of_entry_updated. 게다가, timestamp_type 항목이 삽입 (예 : "1"), 업데이트 (예 : "2") 및 "deletion"과 같은 추가 할 수있는 다른 모든 것을 알려줍니다.

이 디자인에 대해 어떻게 생각하는지 알고 싶습니다. 나는 모범 사례, 시간이 지남에 따라 작동하는 것과 규모에 가장 관심이 있습니다. 참조, 링크, 블로그 항목은 환영합니다. 나는이 문제를 해결하려고 시도하는 적어도 하나의 특허 (보류 중)를 알고 있지만 현재 세부 사항은 공개되지 않은 것 같습니다.

건배, 에두아르도

도움이 되었습니까?

해결책

당신이 그것에있는 동안, 또한 변경 한 사용자를 기록하십시오.

별도의 테이블 디자인 (다른 사람들이 강조한 조인 성능 외에)의 결함은 모든 테이블에는 키에 대한 ID 열이 있습니다. 항상 사실은 아닙니다.

SQL Server를 사용하는 경우 새로운 2008 버전은 그들이 호출하는 것을 지원합니다. 데이터 캡처를 변경하십시오 그것은 당신이 말하는 많은 고통을 빼앗아 야합니다. 오라클도 비슷한 것을 가지고 있다고 생각합니다.


업데이트 : 분명히 Oracle은 SQL Server와 동일합니다. 또는 오히려 SQL Server는 Oracle의 구현이 먼저 이루어 졌기 때문에 Oracle과 동일한 것을 호출합니다.)
http://www.oracle.com/technology/oramag/oracle/03-nov/o63tech_bi.html

다른 팁

감사 할 각 테이블이 두 개의 테이블이있는 디자인을 사용했습니다.

create table NAME (
  name_id int,
  first_name varchar
  last_name varchar
  -- any other table/column constraints
)

create table NAME_AUDIT (
  name_audit_id int
  name_id int
  first_name varchar
  last_name varchar
  update_type char(1) -- 'U', 'D', 'C'
  update_date datetime
  -- no table constraints really, outside of name_audit_id as PK
)

채워진 데이터베이스 트리거가 생성됩니다 NAME_AUDIT 모든 일이 끝날 때마다 NAME. 이렇게하면 테이블에 대한 모든 단일 변경에 대한 기록이 있습니다. 응용 프로그램은 데이터베이스 트리거에 의해 유지되기 때문에 이에 대한 실제 지식이 없습니다.

합리적으로 잘 작동하며 구현하려면 응용 프로그램 코드를 변경할 필요가 없습니다.

나는 개별 테이블에 타임 스탬프를 추가하는 것을 선호한다고 생각합니다. 합성 키에서 타임 스탬프 테이블에 가입하는 것은 문자열 인 것 중 하나가 느려질 것이며 많은 양의 데이터가 있으면 결국 실제 문제가됩니다.

또한 타임 스탬프를 살펴볼 때 많은 시간이 걸릴 때 애플리케이션에서 문제를 디버깅 할 때 항상 다른 테이블에 가입하지 않고 바로 데이터를 원할 것입니다.

제안 된 방법의 장점은 변경을 한 사용자를 추적하는 것과 같이 타임 스탬프 테이블에 다른 필드를 추가 할 수있는 옵션을 제공한다는 것입니다. 예를 들어 누가이 계약을 상환했는지와 같은 민감한 필드로 편집을 추적 할 수 있습니까?

별도의 파일에서 레코드를 로깅하면 다음과 같은 레코드에 여러 변경 사항을 표시 할 수 있습니다.

MM/DD/YY HH : MM : MM : SS XXX MM/DD/YY HH : MM : MM : SS 필드 가격 XXX, MM/DD/YY HH : MM : SS 레코드 XXX에 의해 삭제되었습니다.

한 가지 단점은 메인 테이블의 변경 사항을 반영하기 위해 타임 스탬프 테이블에 인서트를 수행하는 추가 코드입니다.

트리거에서 벗어나기 위해 타임 스탬프 물건을 설정하는 경우 트리거를 설정할 수있는 작업 (읽기?)보다 기록 할 수 있습니다. 또한 잠금 장점이있을 수 있습니다.

(소금 한 알로 가져 가십시오. 나는 DBA 또는 SQL 전문가가 아닙니다)

예, 저는 그 디자인을 좋아하고 일부 시스템과 함께 사용합니다. 일반적으로 일부 변형 :

LogID  int
Action varchar(1)     -- ADDED (A)/UPDATED (U)/DELETED (D)
UserID varchar(20)    -- UserID of culprit :)
Timestamp datetime    -- Date/Time
TableName varchar(50) -- Table Name or Stored Procedure ran
UniqueID int          -- Unique ID of record acted upon
Notes varchar(1000)   -- Other notes Stored Procedure or Application may provide

디자인과의 악몽은 모든 단일 삽입, 업데이트 또는 삭제가 해당 테이블에 맞아야한다는 것입니다. 이로 인해 주요 성능과 잠금 문제가 발생할 수 있습니다. 타임 스탬프뿐만 아니라 그런 테이블을 일반화하는 것은 나쁜 생각입니다. 또한 데이터를 꺼내는 것은 악몽 일 것입니다.

사용자가보고 싶지 않은 필드 추가에서 코드가 GUI 레벨에서 중단되는 경우, 필요한 열의 수를 지정하고 절대 선택하지 않아야하는 GUI에 코드를 잘못 작성하는 것입니다.

타임 스탬프를 얻으려면 추가 조인이 공연해야한다고 생각합니다. 그 외에는 아무런 문제가 없습니다.

우리는 당신이 한 일을 정확히했습니다. 객체 모델과 최소한의 코드로 모델에 새로운 스탬프와 다른 유형의 스탬프를 추가 할 수있는 능력에 좋습니다. 우리는 또한 변경을 한 사용자를 추적하고 있었고, 많은 논리 가이 스탬프를 기반으로 크게있었습니다. 그것은 아주 잘 지 냈습니다.

한 가지 단점은 화면에보고 및/또는 많은 다른 스탬프를 표시하는 것입니다. 당신이 우리가 한 방식으로 그것을하고 있다면, 그것은 많은 결합을 일으켰습니다. 또한 백쪽 결말 변화는 고통이었습니다.

우리의 솔루션은 "세션"테이블 외에 "거래"테이블을 유지하는 것입니다. 명령어 업데이트, 삽입 및 삭제 명령어는 모두 "트랜잭션"객체를 통해 관리되며 이러한 각 SQL 명령은 데이터베이스에서 성공적으로 실행되면 "트랜잭션"테이블에 저장됩니다. 이 "트랜잭션"테이블에는 TransactionTtype (INSERT, DELETE 용 D, UPDATE의 U), TransactionDateTime 등 및 외국 키 "SessionID"와 같은 다른 필드가 있으며, 누가 지침을 보냈는지 알려줍니다. 일부 코드를 통해 누가 무엇을했는지 확인하는 것이 가능합니다 (Gus가 월요일에 기록을 만들었습니다. Tim은 화요일에 단가를 변경했으며 Liz는 목요일에 추가 할인을 추가했습니다).

이 솔루션의 장점은 다음과 같습니다.

  1. "누구와시기"를 말하고 사용자에게 보여줄 수 있습니다! (SQL 문을 분석하려면 코드가 필요합니다)
  2. 데이터가 복제되고 복제가 실패하면이 테이블을 통해 데이터베이스를 재건 할 수 있습니다.

단점이 있습니다

  1. 한 달에 100,000 개의 데이터 업데이트는 TBL_TRANSACTION에서 100,000 레코드를 의미합니다.
  2. 마지막 으로이 테이블은 데이터베이스 볼륨의 99% 인 경향이 있습니다.

우리의 선택 : 90 일 이상의 모든 기록은 매일 아침 자동으로 삭제됩니다.

필립,

단순히 90 일 이하의 것을 삭제하지 말고 먼저 별도의 DB로 이동하거나 텍스트 파일로 써서 보존하기 위해 무언가를하고 메인 프로덕션 DB에서 옮기십시오.

그것으로 내려 오면, 대부분은 "가장 많은 문서가 승리 한 그는"의 경우입니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top