Локальный ключ автоинкремента - PullRequest
1 голос
/ 08 мая 2019

Каков наилучший способ реализации ключа автоинкремента, который является «локальным» для некоторого другого столбца (, т. Е. comment идентификатор начинается с 1 для каждого блога post)?

Например, в GitHub номер выпуска является локальным для репозитория: проблема № 1 означает, что это первая проблема вашего репо, и облегчает жизнь всем, поскольку не приходится использовать более длинные и, казалось бы, случайные идентификаторы.

Например, учитывая:

CREATE TABLE post (
    id     bigserial PRIMARY KEY
  , title  varchar(255) NOT NULL
);

CREATE TABLE "comment" (
    post_id    bigint REFERENCES post NOT NULL
  , id         bigint NOT NULL
  , "comment"  text NOT NULL
  , PRIMARY KEY (id, post_id)
);

Одним из способов решения проблемы является вычисление максимального значения id всех комментариев для данного post_id:

INSERT INTO post (id, title) VALUES (1, 'first post');

INSERT INTO "comment" (post_id, id, "comment") VALUES (
  1,
  (SELECT COALESCE(MAX(id) + 1, 1) FROM "comment" WHERE post_id = 1 LIMIT 1),
  '1st comment of 1st post'
);

^ Это похоже на клудж, и я также беспокоюсь о возможных проблемах с сериализуемостью.

Интересно, как лучше всего это реализовать (под PostgreSQL)? Спасибо!

1 Ответ

1 голос
/ 08 мая 2019

Я бы сказал, что простой способ - забыть об этом. То есть создайте таблицу следующим образом:

create table comments (
    comment_id bigserial primary key,
    post_id bigint REFERENCES post NOT NULL,
    comment text NOT NULL
);

А затем вычислите значение на лету:

create view v_comments as
    select c.*,
           row_number() over (partition by post_id order by comment_id) as post_seqnum
    from comments c;

Конечно, это не совсем то же самое. Например, post_seqnum не уникально идентифицирует каждую строку с течением времени - потому что delete может изменить порядок.

Тем не менее, он по-прежнему имеет уникальный идентификатор для каждой строки, который можно использовать для таких целей. Кроме того, существует столбец первичного ключа * , который обычно предпочтительнее для ссылок на внешние ключи и отладки.

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