#13. PosgreSQL. ACID, нормалізіція
PosgreSQL. ACID, Нормальні форми бази даних
ACID
ACID (англ. Atomicity, Consistency, Isolation, Durability) — це набір властивостей, що гарантують надійну роботу транзакцій бази даних: атомарність, узгодженість, ізольованість, довговічність.
В контексті баз даних, послідовність операцій з базою даних, яка задовольняє властивостям ACID, можна розглядати як одну логічну операцію над даними. Така послідовність операцій називається транзакцією. Наприклад, переказ коштів з одного банківського рахунку на інший містить численні операції, але є єдиною транзакцією.
1983 року Андреа Рейтер і Тео Хардер ввели акронім ACID, ґрунтуючись на вимогах, які сформулював раніше науковець Джим Грей.
https://uk.wikipedia.org/wiki/ACID
Вимоги
За Рейтером та Хардером, вимоги до цих чотирьох властивостей наступні:
Atomicity — Атомарність
Транзакції часто містять в собі багато операцій. Атомарність гарантує, що жодна транзакція не буде виконана частково. Будуть або виконані всі операції, що беруть участь у транзакції, або не виконано жодної. Якщо протягом роботи однієї з операцій виникне помилка і операцію буде відхилено, то будуть відхилені також усі інші зміни, здійснені в межах транзакції. Система має бути атомарною у кожній ситуації, враховуючи відключення електроенергії, помилки та збої. Гарантія атомарності перешкоджає частковому оновленню бази даних, яке насправді може спричинити ще більші проблеми, аніж оновлення всієї бази в межах однієї транзакції.
Прикладом атомарної транзакції є переказ грошей з рахунку на рахунок, який проходить двома операціями: зняття грошей з першого рахунку та збереження їх на другому. Виконання цих операцій в атомарній транзакції забезпечує узгодженість даних бази, тобто гроші не віднімуться та не зарахуються, якщо одна з цих двох операцій зазнає невдачі.
Consistency — Узгодженість
Відповідно до вимоги узгодженості, система має перебувати в узгодженому, несуперечливому стані до початку дії транзакції і по її завершенню. При цьому вона може перебувати в неузгодженому стані протягом виконання транзакції, проте ця неузгодженість не буде видимою за межами транзакції завдяки іншим властивостям — атомарності та ізольованості.
Таким чином, узгодженість гарантує інваріантивність бази даних: будь-які дані, записані в базу, мають відповідати усім визначеним правилам, враховуючи обмеження, каскади, тригери та будь-яку їхню комбінацію. Це запобігає пошкодженню бази даних некоректною транзакцією, але не гарантує правильність транзакції. Посилальну цілісність гарантує відношення унікального ключа до зовнішнього.
Наприклад, при переведенні коштів з рахунку на рахунок, кошти можна спочатку зняти з першого рахунку, після чого нараховувати на другий. Відповідно, після зняття коштів, але до їх нарахування система перебуває в неузгодженому стані: коштів немає на жодному з рахунків. Але після завершення транзакції повна сума перебуватиме на другому (або першому у випадку скасування транзакції) рахунку.
Isolation — Ізольованість
Ізольованість означає, що жодні проміжні зміни не будуть видимі за межами транзакції аж до її завершення. Питання ізоляції стає актуальним при одночасній роботі багатьох транзакцій з тими самими даними. За цією вимогою, якщо дві транзакції намагатимуться змінити одні й ті самі дані, то одну з них буде відхилено або призупинено до завершення другої.
Durability — Довговічність
Довговічність гарантує, що незалежно від інших проблем після відновлення працездатності системи результати завершених транзакцій будуть збережені. Іншими словами, якщо користувач отримав повідомлення про успішне завершення транзакції, то він може бути впевнений, що дані будуть збережені та відновлені у випадку збоїв.
Нормалізація баз даних
Нормалізація - це процес упорядкування даних у базі даних таким чином, щоб вона була вільна від надлишковості та залежності. Це допомагає усунути невідповідності та аномалії даних, тим самим покращуючи цілісність даних. Нормалізація - це набір правил або вказівки щодо розробки схеми бази даних таким чином, щоб уникнути дублювання даних, надмірності даних і неузгодженості даних.
Існує кілька нормальних форм, кожна з яких будується на попередній, які скеровують нас у процесі нормалізації. Найпоширенішими звичайними формами є:
-
Перша нормальна форма (1NF): кожен стовпець має містити атомарні (неподільні) значення. У таблиці не повинно бути повторюваних груп або масивів даних.
-
Друга нормальна форма (2NF): кожен неключовий стовпець має функціонально залежати від усього первинного ключа. Іншими словами, кожен стовпець у таблиці має бути пов’язаний із первинним ключем, а не залежати від будь-яких інших неключових стовпців.
-
Третя нормальна форма (3NF): усі неключові стовпці мають залежати лише від первинного ключа, а не від будь-яких інших неключових стовпців. Це усуває транзитивні залежності.
Нормалізація зменшує надлишковість даних і залежність, роблячи базу даних більш ефективною, гнучкою та масштабованою. Це також допомагає підтримувати узгодженість і точність даних, а також гарантує належну обробку оновлень і видалень.