2012-01-27 4 views
0

저는 주로 다른 사람들에 대한 정보를 저장하는 PostgreSQL의 db를 디자인하고 있습니다. 날짜와 텍스트 항목으로 구성된 각 사람과 로그를 연결하고 싶습니다. 로그는 임의의 수의 항목을 가질 수 있습니다.PostgreSQL에서 임의의 수의 항목을 가진 로그

  1. 은 내가 생각 내가 원하는 것은 이런 log_table입니다 :

    person_id | row_num | row_date | row_text 
    ----------------------------------------- 
         1 |  1 | 01/01/12 | Blah... 
         2 |  1 | 01/02/12 | Foo... 
         1 |  2 | 01/04/12 | Bar... 
    

하지만 제대로 증가 할 row_num을 얻는 방법을 모르는 여기에 내가 장난 삼아 생각해 왔던 아이디어입니다 ; 그 person_id에 대해 가장 큰 현재 row_num보다 1을 더 기본값으로 설정해야합니다. 즉, 주어진 person_id에 대한 row_num은 순차적이어야합니다.

  1. 또는 모든 로그 항목이 별개의 행 번호를 가질 수 있도록 그냥 상관없이 person_idrow_num 증가를 가질 수 있습니다. 그러나 person_id 1의 로그가 1 행에서 3 행으로 점프하는 것은 만족스럽지 않으며 오류가 발생하기 쉽지 않을 수도 있습니다.

  2. 마지막으로 생각한 것은 복합 유형 log_entry = (date, text)을 작성하여 person 테이블에 로그를 직접 포함시키는 것입니다.

    person_id | name | log 
    ---------------------- 
         1 | Bob | {(01/01/12, Blah...), (01/04/12, Bar...)} 
    

을하지만이 성가신 것 : 그런 다음 person 테이블의 열 log 배열을 저장할 수 있습니다.

제 질문은 다음과 같습니다. b) 솔루션 1의 자동 증가 문제를 해결할 수있는 방법은 무엇입니까? 중요하다면, 이것은 개인적인 사용을위한 작은 DB입니다; 좋은 구조를 원하지만, 나는 유일한 사용자 일 가능성이 높습니다. 어떤 도움을 주셔서 감사합니다!

답변

1

행을 삽입 한 시간을 저장하기 위해 타임 스탬프를 사용하지 않는 이유는 무엇입니까?

당신이 테이블에 추가 ROW_NUM 열을 필요로하지 않으며, 당신은 항상 즉시 그것을 "계산"할 수 있습니다 그 방법 :

물론
SELECT person_id, 
     row_number() over (partition by person_id order by row_timestamp) as row_num, 
     row_timestamp, 
     row_text 
FROM log_table 

사용자가보다 더 생성하는 가능성이있는 경우 하나의 항목은 마이크로 초이며 정확히 동일한 시간 소인이있는 로그 항목이있을 수 있습니다.

하지만 사용량이 많은 시스템에서도 이럴 가능성은 거의 없습니다 (불가능하지는 않음).

타임 스탬프를 사용할 수 없거나 사용하고 싶지 않은 경우 항상 모든 사용자에 대해 증가하는 시퀀스를 사용하고 row_number() 함수를 사용하여 검색 중에 gapless 행 번호를 생성합니다 (위에 표시된대로 순서에 의해 채워진 열에 대해 order by를 사용하십시오.

+0

감사! row_number() 함수는 정확히 내가 필요로하는 (그리고 알지 못했던) 기능입니다. 항목이 수동으로 만들어지기 때문에 시간 소인을 사용하고 싶지는 않으며 시간순으로 추가 될 것이라고 보장 할 수는 없지만 기본 아이디어는 완벽합니다. – followthemusic

관련 문제