Журналы с произвольным количеством записей в PostgreSQL - PullRequest
0 голосов
/ 27 января 2012

Я создаю базу данных в 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 увеличивать должным образом;по умолчанию он должен быть больше, чем самый большой текущий row_num для этого person_id.Другими словами, row_num s для данного person_id должно быть последовательным.

  1. Или я могу просто увеличить row_num независимо от person_id, чтобы каждая запись журналаимеет отличный номер строки.Но, кажется, не очень приятно, что лог person_id 1 перепрыгивает со строки 1 на строку 3, и это также может затруднить обнаружение ошибок.

  2. Моя последняя идея состоит в том, чтобывключите журнал непосредственно в таблицу person, сделав составной тип log_entry = (date, text).Тогда столбец log в таблице person может хранить массив:

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

Но это кажется громоздким.

Так что мои вопросы, а)какое решение, если таковое имеется, является хорошим дизайном;б) любой способ решить проблему автоинкремента для решения 1?Если это имеет значение, это небольшой дБ для личного использования;Я хочу хорошую структуру, но, скорее всего, я буду единственным пользователем.Большое спасибо за любую помощь!

1 Ответ

1 голос
/ 27 января 2012

Почему вы не используете метку времени для хранения времени, когда строка была вставлена?

Таким образом, вам не нужен дополнительный столбец 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 () для генерации номера строки без пробелов во время извлечения (как как показано выше, просто используйте порядок в столбце, заполненном последовательностью).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...