Тема: Редагування в таблиці БАГАТО ДО БАГАТЬОХ

Є дві таблиці PA_Mail і PA_UserToMail

CREATE TABLE "PA_Mail" (
    "id"    INTEGER NOT NULL,
    "name"    varchar(100),
    "message_text"    varchar(4096),
    PRIMARY KEY("id" AUTOINCREMENT)
)
CREATE TABLE "PA_UserToMail" (
    "id"    INTEGER NOT NULL,
    "mail_id"    integer,
    "fb_user_id"    integer,
    FOREIGN KEY("fb_user_id") REFERENCES "PA_FBUser"("id"),
    FOREIGN KEY("mail_id") REFERENCES "PA_Mail"("id"),
    PRIMARY KEY("id" AUTOINCREMENT)
)

PA_FBUser не показую, так як реалізація таблиці в цьому прикладі не знадобиться.

В програмі яку я розробляю потрібно зробити реалізацію "Edit" функції.

В таблицю PA_Mail записуються тільки:
name (ім'я групи)
message_text (текст який буде надсилатися користувачам)

В таблицю PA_UserToMail потрібно записати:
mail_id - ІД з PA_Mail (тобто воно буде завжди однакове для одного повідомлення, яке надсилається багатьом користувачам)
fb_user_id - ІД з PA_FBUser, список ІД'шок користувачів, кому потрібно надіслати повідомлення.

Підчас редагування користувачі (їх ІД) можуть бути видаленні (DELETE), або додані (INSERT). А сама команда UPDATE не має знадобитися.

Відредагувати PA_Mail легко.

А з PA_UserToMail не зрозуміло як правильно редагувати.

Варіант який я придумав:
* Спочатку знайти всі ІД в таблиці PA_UserToMail БД, яких немає після редагування в таблиці PA_UserToMail програми, і видалити такі рядки з PA_UserToMail БД.
* Потім пошукати всі ІД в таблиці PA_UserToMail програми, яких немає в таблиці PA_UserToMail БД, і додати їх в PA_UserToMail БД.

Запитання:
Чи можна все те що я написав у своєму варіанті реалізувати одним запитом ?
Можливо є вже готові рішення того як правильно редагувати таблицю БАГАТО ДО БАГАТЬОХ в таких випадках як в мене ?

2

Re: Редагування в таблиці БАГАТО ДО БАГАТЬОХ

[відповідаю нашвидкуруч] На думку спадає запит Merge. Спростило б написання запису, якби в архітектурі було передбачено не видалення, а "закривання" запису. Для реалізації "закривання" потрібно:

1) додати колонку isClosed int (можливі значення 1 або 0) або ж boolean
2) дещо складніше, при цьому це класичний підхід для побудови dwh, - slowly changing dimensions, насправді рідко застосовується в транзакційних бд, але чому б ні; додаємо дві колонки dateStart i dateClose, для "відкритих" записів дати будуть 2000-01-01 - 2100-01-01, а для "закритих" - 2000-01-01 - 2021-09-01 (сьогоднішня дата).

3

Re: Редагування в таблиці БАГАТО ДО БАГАТЬОХ

Зазвичай, якщо якісь дії відбуваються в середині програми, і потім їх треба синхронізувати з БД, то робиться лог цих дій. Якщо набори даних не великі, то також можна робити копію на стороні програми, і потім порівнювати її зі зміненим набором.
Варіант окремо вичитувати з БД оригінальний набір, щоб порівняти зі зміненим, погано масштабується. Тому зазвичай його не застосовують.

Подякували: Betterthanyou1