2011-03-22 5 views
2

내 문제는 대형 웹 응용 프로그램에서 많은 이벤트가 발생하고 있으며 지금은 (감사 목적으로) 무슨 일이 있었는지보고 싶거나 통계보고를 위해 데이터를 집계하고 싶습니다.감사 및 통계 데이터 수집

한 가지 해결책은 각 이벤트 유형에 대해 DB에 테이블을 만들고 거기에 기록하는 것입니다. 예 : 암호가 변경되고 날짜, 사용자, IP 등을 기록하십시오. 필요한 감사 정보를 제공하고 테이블에 대해 보고서를 실행하여이 기능이 얼마나 자주 사용되는지 확인할 수 있습니다. 단점은 캡처하려는 각 유형의 이벤트에 대해 새 테이블을 만들어야한다는 것입니다.

이상적인 솔루션은 XML 필드와 같이 유연한 구조를 가진 단일 테이블을 사용하는 것이지만 테이블의 xml 필드가 좋지는 않습니다.

내 질문 : 내 문제를 해결하는 잘 사용되는 패턴이 있습니까?

Event Type 
    Event Type Id (PK) 
    Name 
    Number of parameters (useful - not essential) 

Event 
    Event Id (PK) 
    Event Type Id (FK) 
    Timestamp 

Event Attribute 
    Event Attribute Id (PK) 
    Event Id (FK) 
    Name 
    Value (as string in all cases) 
    Sequence Number (within Event. this may well not be needed, but can be a convenience) 

내가이 명명 된 생각하지 않는다 :

답변

1

이벤트 당 하나 개의 테이블과 하나 개의 테이블 사이의 중간 방법은 (이벤트의 차이는 이벤트와 수행의 매개 변수/데이터이라고 가정)입니다 패턴이지만 데이터베이스 설계에서 반복적으로 나타나는 패턴입니다.

XML을 저장할 필요없이 필요한 모든 정보를 제공한다고 생각합니다.

+0

감사합니다. Chris - 스키마와 설명에 감사드립니다. – Guy

2

대형 웹 응용 프로그램의 크기는 어느 정도입니까?

이벤트를 XML 모양으로 로깅해야하며 일부 데이터베이스 (예 : SQL Server)에서 해당 XML을 직접 쿼리 할 수 ​​있습니다. 그러나 이러한 쿼리의 성능은 끔찍합니다.

데이터베이스에 이벤트 로깅을 수행하기 전에 생성하려는 초당 기록 수를 알아야합니다. 숫자가 크면 데이터베이스에 심각한 부하가 걸려 전체 응용 프로그램 성능에 영향을 줄 수 있습니다. 또한 많은 수의 레코드를 축적하면 데이터를 쿼리하는 데 시간이 오래 걸릴 수 있습니다. 데이터 집계는 더욱 악화됩니다. 관계형 데이터베이스는 집계를 수행하는 데 매우 효율적이지 않습니다.

위의 Chris의 제안은 작은 데이터베이스에서는 잘 작동하지만 쿼리에서는 조인을 사용해야하므로 확장되지 않습니다. 데이터를 비정형 화하는 것이 더 나을 수도 있습니다.

애플리케이션이 지금 당장 걱정할 트래픽이 충분하지 않더라도 위에서 설명한 이유 때문에 DB에 이벤트 로깅이 확장되지 않습니다.

Concreate 제안 :

당신은 많은 트래픽을보다 쉽게 ​​알 수있을 것입니다 수 있도록 별도로 이동합니다 들어, DB에 로그를 별도의 스키마에이 작업을 수행하기로 결정하지 않는 경우 db 서버를 프로덕션 데이터베이스에서 오프로드하십시오.

이벤트를 XML로 기록하기로 결정한 경우 관계형 데이터베이스를 사용하는 것이 중요한지 고려하십시오. 효율적으로 쿼리 할 수없는 경우 간단한 로그 파일이 훨씬 간단합니다. 나중에 그 로그 데이터를 처리하는 방법을 알아 내야 할 것이지만 드문/간단한 쿼리의 경우 grep, awk 등을 사용하여 일부 스크립트를 작성하면 놀라 울 정도로 긴 시간이 걸립니다.

(대단히) 대규모 응용 프로그램에서 일반적으로 사용되는 방법은 파일에 로깅 한 다음 map-reduce를 사용하여 분석 (집계)을 실행하는 것입니다. 에.

+0

Elad 감사합니다. 자세한 답변을 부탁드립니다. – Guy

+0

관심사와 마찬가지로 조인이 확장되지 않는다고 제안하는 것은 무엇입니까? 조인은 비용이 제로이기 때문에 데이터베이스 나 스키마의 확장성에 아무런 영향을 미치지 않는다는 것을 항상 알고있었습니다. –

+1

@ chris-walton google "데이터베이스 조인은 확장되지 않습니다."예를 들어, 주로 NoSQL 캠프에서 오는 많은 예제를 얻을 수 있습니다. 개인적인 경험을 통해, 일단 테이블 크기 (MySQL의 1M 레코드는 구성, 특히 RAM 할당에 크게 의존하지만)를 전달하면 결합 된 쿼리의 성능이 빠르게 저하되기 시작합니다. – Elad