Таблица истории SQL "многие ко многим"

Я хочу хранить историю изменений записей в «Таблице отношения многие ко многим». Таблицы - это A, B и AB_Map, где таблица AB_Map - это таблица связей между A и B. Учитывая неизменность таблицы B (записи внутри таблицы B никогда не меняются, поэтому таблица B не нуждается в истории) Scanario таков:

Table A
---------
ID_a (PK)
a_field1
a_field2
a_field3

Table AB_Map
-------------
ID_a (PK, FK1)
ID_b (PK, FK2)
quantity

Table B (Records never update)
----------
ID_b (PK)
b_field1
b_field2

Поэтому я хочу сохранить историю таблиц A и AB_Map.

Я думал только так:

Создайте таблицу A_History и таблицу AB_Map_History:

Table A_History
-----------------
ID_a_history (PK)
ID_a (FK)
a_field1
a_field2
a_field3

Table AB_Map_History
--------------------
ID_a_history(PK, FK1)
ID_b (PK, FK2)
quantity

Для каждого изменения в таблице A предыдущая запись будет вставлена ​​в A_History, а связанные записи в таблице AB_Map будут вставлены в AB_Map_History. Этот способ создаст запись в Table_Map_History также, если нет никаких изменений между отношением с A к B. Я думаю, что это более простой способ сделать это, но я не люблю расходовать память, если в этом нет необходимости.

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

Теперь я использую этот триггер для таблицы A, чтобы разрешить мою ситуацию:

CREATE DEFINER = `root`@`localhost` TRIGGER `SaveHistory` BEFORE UPDATE
ON `A` FOR EACH ROW
BEGIN
    INSERT INTO A_History(
        ID_a_history,
        ID_a,
        a_field1,
        a_field2,
        a_field3
    )
VALUES(
    null,
    OLD.ID_a,
    OLD.a_field1,
    OLD.a_field2,
    OLD.a_field3
);

INSERT INTO AB_Map_History(
    AB_Map_History.ID_a_history,
    AB_Map_History.ID_b,
    AB_Map_History.qnt_kt
)
SELECT
    LAST_INSERT_ID(), AB_Map.ID_b, AB_Map.qnt_kt
FROM
    AB_Map
WHERE
    AB_Map.ID_a = OLD.ID_a;
END

Моя цель - сохранять записи в AB_Map_History только при изменении отношения между записью в A и записями в B или при изменении количества.

Надеюсь, я ясно объяснил свою проблему. заранее спасибо

Так в чем вопрос?

Mureinik 01.10.2018 16:52

Я полагаю, вы хотите написать триггер. Он хочет срабатывать при изменении записи в A и изменении записей в B, или при изменении количества.

sanduniYW 01.10.2018 17:02

Мой вопрос в том, верен ли мой подход или есть другая альтернатива, которая экономит место в моей базе данных.

patrik cavina 01.10.2018 17:03

@sanduniYW я отредактировал сообщение о добавлении триггера, который сейчас используется

patrik cavina 01.10.2018 17:28

Ваш код работает нормально или нет?

sanduniYW 01.10.2018 17:45

@sanduniYW мой код работает нормально, но я не был уверен в его правильности с точки зрения памяти

patrik cavina 02.10.2018 08:11
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
6
110
0

Другие вопросы по теме