Să creăm o schemă completă pentru un magazin online:
-- Tabela categorii
CREATE TABLE categorii (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nume VARCHAR(100) NOT NULL,
slug VARCHAR(100) NOT NULL UNIQUE,
parinte_id INT UNSIGNED DEFAULT NULL,
descriere TEXT,
ordine INT DEFAULT 0,
activ TINYINT(1) DEFAULT 1,
creat_la DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (parinte_id) REFERENCES categorii(id) ON DELETE SET NULL,
INDEX idx_slug (slug),
INDEX idx_parinte (parinte_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tabela clienti
CREATE TABLE clienti (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
prenume VARCHAR(50) NOT NULL,
nume VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
telefon VARCHAR(20),
adresa TEXT,
oras VARCHAR(50),
judet VARCHAR(50),
cod_postal VARCHAR(10),
data_nastere DATE,
creat_la DATETIME DEFAULT CURRENT_TIMESTAMP,
actualizat_la DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_email (email),
INDEX idx_oras (oras),
INDEX idx_nume (nume, prenume)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tabela produse
CREATE TABLE produse (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nume VARCHAR(200) NOT NULL,
slug VARCHAR(200) NOT NULL UNIQUE,
descriere TEXT,
descriere_scurta VARCHAR(500),
pret DECIMAL(10,2) NOT NULL,
pret_redus DECIMAL(10,2) DEFAULT NULL,
stoc INT UNSIGNED DEFAULT 0,
sku VARCHAR(50) UNIQUE,
categorie_id INT UNSIGNED,
imagine VARCHAR(500),
greutate DECIMAL(8,3),
activ TINYINT(1) DEFAULT 1,
creat_la DATETIME DEFAULT CURRENT_TIMESTAMP,
actualizat_la DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (categorie_id) REFERENCES categorii(id) ON DELETE SET NULL,
INDEX idx_categorie (categorie_id),
INDEX idx_pret (pret),
INDEX idx_stoc (stoc),
FULLTEXT INDEX idx_search (nume, descriere)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tabela comenzi
CREATE TABLE comenzi (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
client_id INT UNSIGNED NOT NULL,
subtotal DECIMAL(10,2) NOT NULL,
transport DECIMAL(10,2) DEFAULT 0.00,
total DECIMAL(10,2) NOT NULL,
status ENUM('nou','confirmat','procesare','expediat','livrat','anulat','returnat') DEFAULT 'nou',
metoda_plata ENUM('card','ramburs','transfer','paypal') NOT NULL,
adresa_livrare TEXT NOT NULL,
note TEXT,
data_comanda DATETIME DEFAULT CURRENT_TIMESTAMP,
data_expediere DATETIME,
data_livrare DATETIME,
FOREIGN KEY (client_id) REFERENCES clienti(id) ON DELETE RESTRICT,
INDEX idx_client (client_id),
INDEX idx_status (status),
INDEX idx_data (data_comanda)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tabela detalii_comanda (many-to-many: comenzi <-> produse)
CREATE TABLE detalii_comanda (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
comanda_id INT UNSIGNED NOT NULL,
produs_id INT UNSIGNED NOT NULL,
cantitate INT UNSIGNED NOT NULL DEFAULT 1,
pret_unitar DECIMAL(10,2) NOT NULL,
total_linie DECIMAL(10,2) GENERATED ALWAYS AS (cantitate * pret_unitar) STORED,
FOREIGN KEY (comanda_id) REFERENCES comenzi(id) ON DELETE CASCADE,
FOREIGN KEY (produs_id) REFERENCES produse(id) ON DELETE RESTRICT,
INDEX idx_comanda (comanda_id),
INDEX idx_produs (produs_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;