DDL (Data Definition Language) та DML (Data Manipulation Language) - це два ключові поняття в області реляційних баз даних.
DDL (Data Definition Language)
DDL (Data Definition Language) - мова
опису даних. Ця мова використовується для опису структури бази даних, створення, зміни та видалення об'єктів бази даних. Тут ми маємо справу з такими об'єктами, як таблиці, індекси, схеми тощо.
Наприклад, для створення нової таблиці у базі даних у SQL можна використати наступний код:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
У цьому прикладі ми використали DDL-операцію
CREATE TABLE, щоб створити нову таблицю з іменем "users". Поля "id", "username" та "email" описані з їх типами даних та обмеженнями, такими як
NOT NULL та
UNIQUE. Крім того, ми вказали, що значення для поля "created_at" буде за замовчуванням поточним (час на момент створення).
В DDL існує кілька основних операцій, які використовуються для визначення та зміни структури бази даних:
CREATE: Ця операція використовується для створення нових об'єктів бази даних, таких як таблиці, індекси тощо.
ALTER: За допомогою операції ALTER можна змінювати структуру вже існуючих об'єктів бази даних, наприклад, додавати, змінювати або видаляти колонки в таблиці.
DROP: Ця операція використовується для видалення існуючих об'єктів бази даних, таких як таблиці, індекси тощо.
TRUNCATE: Операція TRUNCATE використовується для видалення всіх записів з таблиці, зберігаючи саму таблицю.
RENAME: використовується для зміни імені вже існуючих об'єктів бази даних, таких як таблиці, стовпці, індекси тощо
DML (Data Manipulation Language)
DML (Data Manipulation Language) - мова маніпулювання даними. Вона використовується для роботи зі змістом бази даних, тобто для створення, оновлення, видалення та виборки (пошуку) даних з таблиць.
Давайте розглянемо приклад використання DML-операцій у SQL:
-- Додавання нового користувача
INSERT INTO users (username, email)
VALUES ('user_name', '[email protected]');
-- Оновлення даних користувача
UPDATE users
SET username = 'new_user_name'
WHERE id = 1;
-- Видалення користувача
DELETE FROM users
WHERE id = 1;
-- Вибірка даних з таблиці
SELECT * FROM users;
У цих прикладах ми використовуємо DML-операції
INSERT,
UPDATE,
DELETE та
SELECT для створення нового запису у таблиці, оновлення інформації про користувача, видалення користувача та отримання всіх користувачів з таблиці відповідно.
Основні операції DML:
INSERT: Ця операція використовується для додавання (створення) нових записів в базі даних.
UPDATE: Операція UPDATE дозволяє змінювати дані вже існуючих записів у таблиці.
DELETE: Ця операція використовується для видалення записів з таблиці бази даних.
SELECT: Використовується для вибірки (пошуку) даних з таблиць бази даних.
Різниця DML та DDL
Для закріплення матеріалу, повторимо різницю цих двох термінів.
D
DL (Data
Definition Language) | D
ML (Data
Manipulation Language)
Definition та
Manipulation - головні відмінності термінів. Перший (definition) - це про
таблиці (опис, створення, налаштування
таблиць). Другий (manipulation) - це про
дані, а саме про маніпуляції над ними (створення, оновлення, видалення та пошук
даних в таблиці).
DDL та DML в міграціях в Ruby on Rails
Приклад DML міграції в Ruby on Rails для додавання нового стовпця до таблиці:
class AddNameToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :name, :string
end
end
У цій міграції ми використовуємо метод
add_column, щоб додати новий стовпець з назвою "name" та типом "string" до таблиці "users".
Приклад DDL міграції в Ruby on Rails для створення нової таблиці:
class CreateProducts < ActiveRecord::Migration[7.0]
def change
create_table :products do |t|
t.string :name
t.decimal :price
t.timestamps
end
end
end
У цій міграції ми використовуємо метод
create_table, щоб створити нову таблицю "products" зі стовпцями "name", "price" та стовпцями міток часу "created_at" та "updated_at".
Приклад міграції в Ruby on Rails з
disable_ddl_transaction!
class AddIndexesToProducts < ActiveRecord::Migration[7.0]
disable_ddl_transaction!
def change
add_index :products, :name
add_index :products, :price
end
end
В цій міграції ми використовуємо
disable_ddl_transaction!, щоб
вимкнути транзакцію DDL для створення індексів на таблиці "products". Це може бути корисно в ситуаціях, коли створення індексів займає багато часу і ви хочете виконати цю операцію без очікування закінчення транзакції. Але що таке транзакція та чому її треба вимикати?
DDL (Data Definition Language) транзакції - це транзакції, які включають операції, які змінюють структуру бази даних. Такі операції можуть включати створення, зміну або видалення таблиць, стовпців, індексів та інших об'єктів бази даних.
Коли ви виконуєте DDL-операції (наприклад, створення таблиці або додавання нового стовпця), ці операції, як правило, виконуються в рамках
транзакційного контексту. Це означає, що вони будуть здійснені як єдина
атомарна операція - або вона буде виконана повністю, або не буде виконана зовсім.
Однак в деяких випадках, особливо коли ви виконуєте масивні DDL-операції, такі як додавання індексів до великих таблиць, включення транзакційного контексту може призвести до проблем з продуктивністю (через те що таблиця буде заблокована на час транзакції. наприклад користувачі не зможуть створювати нові замовлення).
В таких випадках можна використовувати
disable_ddl_transaction! у міграціях Ruby on Rails, щоб вимкнути транзакційний контекст для DDL-операцій. Таким чином, ці операції будуть виконані без очікування закінчення транзакції.
disable_ddl_transaction! зручно використовувати, коли ви хочете уникнути блокування таблиць під час великих операцій створення або зміни схеми бази даних. Але ви маєте бути впевнені, що цю операцію справді безпечно виконувати поза транзакцією.