2013-02-25 2 views
2

보관 기능과 쿼리 기능 모두를 위해 MySQL 데이터베이스로 가져 오려는 일부 보관 된 로그 파일이 있습니다.여러 테이블에 삽입 순서 유지

이러한 로그 파일의 각 줄은 특정 유형의 이벤트를 나타냅니다. 이를 설명하기 위해, 여기에 각 라인은 다른 이벤트 유형 인 상태, 예입니다 :

2013-01-15 03:30:08 - Failed login attempt for user 'helloworld' by 1.2.3.4 
2013-01-15 03:30:08 - User 'helloworld' successfully logged in from 1.2.3.4 
2013-01-15 03:30:08 - User 'helloworld' issued command 'randomcommand' 

참고 타임 스탬프, 즉 문제와 관련이있다. 여러 이벤트가 (같은 초에 발생하는 경우이며, 타임 스탬프는 2 ~이 등, failed_logins, successful_logins, commands

그 접근 방식의 문제 -

내 초기 생각은 각 이벤트에 대한 테이블을 만드는 것이 었습니다 수준의 정밀도), 그들은 서로 다른 테이블에 있기 때문에 그들이 발생한 실제 순서를 알 수있는 방법이 없습니다.

내 다음 생각은 순서를 유지하는 기본 키와 함께 하나의 테이블을 사용하는 것이지만, 모든 이벤트 유형과 함께 손을 놓을 수 있습니다. (이상이 있습니다.)

CREATE TABLE log_lines (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    type INT, // 1 = failed_login, 2 = command, ... 
    failed_logins_user VARCHAR(32), 
    failed_logins_ip VARCHAR(15), 
    commands_user VARCHAR(32), 
    commands_command VARCHAR(128) 
); 

나는 이것을 달성하는 더 좋은 방법이 있다고 생각합니다.

요약하면 로그 파일에서 각 이벤트가 발생하는 순서를 유지하면서 데이터를 쿼리 할 수있게하는 것이 내 목표입니다. 이 문제를 어떻게 해결해야합니까?

+0

얼마나 많은 이벤트 유형이 있습니까? – Alnitak

+0

총 30 개, 대부분 2 개 이상의 필드가 포함됩니다. –

+0

"주문을 보존하는 기본 키"옵션이 그렇게 좋지 않은 이유를 알 수 없습니다. 할 수있는 일은 데이터베이스에 삽입하기 전에 파일을 "준비"하는 것입니다. 예를 들어 grep을 사용하여 원하는 이벤트 유형을 얻을 수 있습니다 ('egrep "event1 | event2 | ... | eventk"yourfile> filetoexport'). – fedorqui

답변

0

하나의 가능한 솔루션 : 모든 행에 대해 두 개의 테이블을 사용하십시오. 하나는 시퀀스 번호 (AUTO_INCREMENT 열) 및 타임 스탬프와 같은 모든 이벤트에 공통 인 열을 저장하고 하나는 이벤트에 다른 세부 정보를 제공하는 것입니다. 먼저 공통 테이블에 삽입 한 다음 거기에서 생성 된 ID를 다른 테이블에서 고유 한 외래 키로 사용할 수 있습니다.

또한 일반적으로 NULL 값은 1 비트의 데이터 만 차지하므로 일부 이벤트 유형에만 필요한 많은 열이있는 단일 테이블을 사용하는 것이 더 나은 해결책이 될 수 있습니다. 그것은 당신의 질의에 의존한다. 보통 모든 타입의 이벤트를 순서대로 질의하면, 하나의 테이블이 더 좋을 것이지만, 주어진 테이블의 특정 이벤트를 추출하는 것은 다른 테이블을 사용하는 것이 더 적합 할 수있다.

type INT, // 1 = failed_login, 2 = command, ... 

당신은 열 이런 종류의에 대한 enum를 사용하여 더 나을 수 있습니다.