Может ли база данных SQL поддерживать режим «только вставка»? - PullRequest
0 голосов
/ 29 мая 2019

В последние годы методология " Вставка только " стала все более популярной.Для тех, кто использует SQL DB, вы, вероятно, знаете, что в большом объеме с большим количеством запросов update DB блокирует строки, и вы начинаете получать «узкое место». Режим вставки * - использовать только вставку (без обновлений) и всегда извлекать самый последний элемент в БД.

Проблема, с которой я сталкиваюсь, связана с запросами SELECT, поскольку существуетполе, которое может быть общим для нескольких записей в БД, и если я захочу сделать запрос по нему, я никогда не узнаю, когда получу все последние записи для указанного выше поля (если только я не использую GROUP иэто не будет эффективным)

Пример схемы:

Допустим, у меня есть следующая схема:

CREATE TABLE users
(
  id         SERIAL    NOT NULL
    CONSTRAINT users_pkey
    PRIMARY KEY,

  first_name VARCHAR(255),
  last_name  VARCHAR(255),
  username   VARCHAR(255),
  email      VARCHAR(255),
  password   VARCHAR(255),
  account_id INTEGER,
  created_at TIMESTAMP NOT NULL
);

Теперь, допустим, у меня есть следующие пользователи, которые связаны с учетной записьюномер 1 (используя account_id): 1. John Doe 2. Jain Doe

Если я захочу отредактировать фамилию John Doe в режиме «Только вставка», я вставлю новую запись, а когда захочу ее восстановитьЯ выполню следующий запрос:

SELECT * from users WHERE email='jhon.doe@test.com' ORDER BY created_at Desc limit 1;

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

Следующий запрос вернет 3 записи, хотя у меня только 2 пользователя

SELECT * from users WHERE account_id=1;

1 Ответ

3 голосов
/ 29 мая 2019

Ответ на ваш вопрос distinct on (в Postgres). Однако неясно, как вы определяете пользователя. Я ожидал бы user_id, но, возможно, email должен служить этой цели.

Запрос выглядит так:

select distinct on (email) u.*
from users u
where account_id = 1
order by email, created_at desc;

Для производительности вам нужен индекс на users(account_id, email, created_at desc).

...