Cours
L'instruction « CREATE TABLE » constitue la base de toute conception de base de données relationnelle. Il définit les données que vous stockez, leur structure et les règles qui garantissent leur exactitude.
Dans ce tutoriel, je vous présenterai les bases de la syntaxe d'CREATE TABLE, des choix de conception pratiques et des exemples concrets afin de vous aider à créer des tableaux intuitifs et efficaces qui répondent à la fois aux besoins actuels et à la croissance future.
Si vous débutez avec SQL, nous vous recommandons de commencerpar notre cours Introduction à SQL ou notre cours SQL intermédiaire afin d'acquérir des bases solides. De plus, je trouve que le document SQL Basics Cheat Sheet, que vous pouvez télécharger, est une référence utile car il contient toutes les fonctions SQL les plus courantes.
Le rôle de CREATE TABLE dans la conception de bases de données
L'instruction « CREATE TABLE » est la commande principale du langage de définition des données (DDL) qui défine la manière dont vos données sont stockées, organisées et accessibles. Avant de la créer, il est important de déterminer ce que la table représente, comment elle est reliée aux autres tables et comment sa structure facilitera les requêtes futures.
La syntaxe de base comprend le nom de la table suivie d'une liste de colonnes, chacune étant définie avec un type de données et des contraintes facultatives. Veuillez examiner la syntaxe ci-dessous :
-- Create table syntax
CREATE TABLE schema_name.table_name (
column_name data_type constraint,
column_name data_type constraint,
column_name data_type constraint,
...
);
Où :
-
schema_name: Espace de noms facultatif pour organiser les tables. -
table_name: Nom clair et descriptif pour l'entité. -
column_name: Le nom d'un champ (attribut) dans le tableau. -
data_type: Définit le format, tel queINT,VARCHARouDATE. -
constraint: Règles facultatives telles quePRIMARY KEY,NOT NULLouUNIQUE.
Cette syntaxe est cohérente sur les principales plateformes SQL telles que MySQL, PostgreSQL et SQL Server, avec seulement quelques différences mineures dans les options avancées. Par conséquent, il est recommandé de respecter des conventions de nommage claires pour les noms de tables et de colonnes afin de garantir la cohérence entre ces plateformes.
Définition des colonnes, des types de données et des contraintes
Après avoir examiné comment créer la structure de la table, nous allons maintenant voir comment définir les colonnes qui structurent les données. Une définition de colonne est composée de trois éléments : le nom de la colonne, son type de données et ses contraintes.
Le choix des types de données appropriés permet d'optimiser les performances de stockage et de requête, par exemple en utilisant le type de données « INT » pour les identifiants numériques ou le type de données « VARCHAR » pour les textes de longueur variable. Des choix inappropriés, tels que l'utilisation inutile de types de données volumineux, peuvent entraîner un gaspillage d'espace et ralentir les requêtes.
Les contraintes garantissent le respect des règles qui assurent la fiabilité et la connectivité de vos données. Par exemple, l'PRIMARY KEY identifie de manière unique chaque ligne, et l'FOREIGN KEY relie les tables afin de maintenir les relations. La contrainte DEFAULT définit des valeurs automatiques, tandis que CHECK garantit que les valeurs répondent à des critères spécifiques.
Veuillez examiner l'exemple ci-dessous, qui présente des contraintes et des types de données clairement définis.
-- Create table syntax with data types and constraints defined
CREATE TABLE orders (
order_id INT PRIMARY KEY, -- Proper PK
user_id INT NOT NULL, -- Required relationship
total DECIMAL(10,2) NOT NULL, -- Exact monetary value
status VARCHAR(20) DEFAULT 'new', -- Controlled default
FOREIGN KEY (user_id) REFERENCES users(user_id) -- Enforce relationship
);
La requête suivante présente un exemple de conception de table inadéquate où l'absence de clés et de contraintes, les types surdimensionnés et les choix de données imprécis peuvent entraîner un stockage incohérent ou inefficace.
CREATE TABLE orders (
id VARCHAR(50), -- Unnecessary string PK
user VARCHAR(255), -- No relationship enforced
total FLOAT, -- Risky for money calculations
status TEXT -- No constraints or defaults
);
Il est recommandé de toujours définir explicitement les types de données et les contraintes en fonction de la conception de votre table et des exigences de votre entreprise.
Je vous recommandede suivre notre cours Introduction aux bases de données relationnelles en SQL afind'apprendre à créer des tables, à appliquer des relations et des contraintes entre les tables.
Conception de tables pour des scénarios réels
Une fois que vous aurez compris la syntaxe d'CREATE TABLE, je vous montrerai comment concevoir des tableaux qui correspondent aux flux de travail réels.
Exemple de commerce électronique
Supposons que vous souhaitiez créer un système de commerce électronique. Vous disposerez des tables customers, orders et products avec des clés étrangères reliant ces tables afin de garantir les relations et l'intégrité référentielle.
Tout d'abord, veuillez créer la table customers avec le schéma suivant afin de stocker les profils utilisateur :
-- Create customers table to store user profiles
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(150) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
Deuxièmement, la table products aura le schéma suivant pour stocker chaque élément de la plateforme.
-- Create products table for catalog of items for sale
CREATE TABLE products (
product_id INT PRIMARY KEY,
name VARCHAR(200) NOT NULL,
price DECIMAL(10,2) NOT NULL, -- Accurate money type
stock INT CHECK (stock >= 0), -- Prevent negative inventory
created_at TIMESTAMP DEFAULT NOW()
);
Enfin, vous disposerez de la table orders pour enregistrer les achats effectués par les clients.
-- Create orders table
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL, -- Link order → customer
order_date TIMESTAMP DEFAULT NOW(),
total_amount DECIMAL(10,2) NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
-- Enforce relationship and ensure customer exists
);
Lors de la création de plusieurs tables, veuillez toujours utiliser la contrainte d'intégrité référentielle ( FOREIGN KEY ) pour définir la relation entre une colonne de la table enfant et l'PRIMARY KEY de la table parent afin de garantir l'intégrité référentielle. Dans notre exemple, cette relation garantit qu'il n'est pas possible de passer une commande pour un client qui n'existe pas.
Tables temporaires et tables clonées
Il peut arriver que vous souhaitiez créer un tableau pour une utilisation rapide ou pour tester une transformation de données sans affecter le schéma en production. Dans ce cas, vous pouvez créer une table temporaire ou une table clonée. Examinons comment créer chacun d'entre eux :
- Tables temporaires : Il s'agit de tables temporaires, souvent visibles uniquement pour la session de base de données en cours, qui sont automatiquement supprimées à la fin de la session. Ils sont utiles pour les transformations de données complexes, le traitement de données en plusieurs étapes ou les tests. La requête ci-dessous illustre comment créer une table temporaire dans PostgreSQL.
-- Temporary copy for short-term analysis
CREATE TEMPORARY TABLE temp_sales AS
SELECT * FROM sales
WHERE sale_date >= CURRENT_DATE - INTERVAL '7 days';
- Tableaux clonés : Il s'agit de copies exactes des tables existantes, y compris les index et les contraintes. Ils sont utiles pour les transactions sensibles où l'intégrité des données doit être préservée lors des modifications.
-- Create quick structural clone for testing or recovery
CREATE TABLE orders_backup AS
SELECT * FROM orders;
Normalisation et dénormalisation
Lors de la conception de tables, l'équilibre entre normalisation et dénormalisation dépend des cas d'utilisation spécifiques, du volume de données et des modèles de requête afin d'optimiser l'efficacité et la maintenabilité du système. Vous trouverez ci-dessous un résumé des cas dans lesquels chaque méthode doit être utilisée :
- Normalisation: Cette méthode consiste à diviser les grandes tables en tables plus petites et liées entre elles, de sorte que chaque élément de données non clé ne soit stocké qu'une seule fois. Ses avantages sont une efficacité améliorée, une redondance minimisée et une maintenance simplifiée.
- Dénormalisation: Cela implique l'ajout stratégique de redondances, comme l'inclusion du nom du client sur chaque ligne de commande. Cette méthode améliore les performances de lecture pour des besoins spécifiques en matière de rapports ou d'analyses, en particulier lorsque les jointures sont lentes.
Optimisation et automatisation de la création de tables
Lorsque vous créez des tables pour votre base de données, il est important de tenir compte des performances et de la facilité de maintenance future. D'après ma vaste expérience en conception de bases de données, je considère que les techniques d'optimisation suivantes sont utiles :
- Indexation : L'ajout d'index sur les colonnes fréquemment utilisées dans les recherches accélère les requêtes. Lorsque vous définissez l'
PRIMARY KEY, un index unique est automatiquement créé. - Partitionnement : Pour les tables volumineuses, le partitionnement divise les données en segments plus petits et plus faciles à gérer, en fonction de critères tels que la date, ce qui améliore l'efficacité des requêtes en limitant la portée de l'analyse.
- Colonnes calculées : Certaines bases de données, telles que SQL Server et PostgreSQL, permettent de définir des colonnes calculées qui calculent dynamiquement des valeurs à partir d'autres colonnes. Cette approche peut réduire le stockage redondant des données et améliorer la vitesse des requêtes.
Dans les flux de travail modernes, l'automatisation joue un rôle important dans la conception et la gestion des schémas. Vous pouvez utiliser les outils et requêtes suivants pour documenter, reproduire ou automatiser le processus :
|
Outil/Méthode |
Objectif |
Exemple d'application |
|
|
Permet de générer des scripts d' |
Répliquer un environnement de production à des fins de test ou de migration. |
|
Requêtes sur le schéma d'information |
Interroger directement les vues de base de données intégrées |
Automatisation de la documentation ou génération dynamique de code d'application basée sur les définitions de colonnes. |
|
FonctionsSQL/Procédures stockées |
Écrire des routines de base de données qui vérifient si une table existe, la suppriment, puis la recréent (souvent appelé modèle « |
Automatisation des scripts de déploiement ou de configuration |
Pour la planification visuelle, vous pouvez utiliser des outils GUI,tels que pgAdmin, MySQL Workbench ou SQL Server Management Studio, afin de générer des scripts DDL, dessiner des diagrammes de relations et améliorer la collaboration entre les membres techniques et non techniques de l'équipe.
Erreurs courantes et meilleures pratiques
La conception de tables efficaces et faciles à maintenir dans SQL garantit des performances optimales de votre base de données. Voici les conseils que je recommande lors de la création de tables en SQL :
-
Sur-normalisation : Le fractionnement des tables en plusieurs petits éléments peut compliquer les jointures et ralentir les requêtes, tandis qu'une sous-normalisation peut entraîner une redondance des données. Pour éviter cela, veuillez toujours utiliser initialement la norme 3NF, puis recourir à la dénormalisation uniquement pour les tableaux de rapports spécifiques où la vitesse de lecture est prioritaire par rapport à la simplicité de mise à jour.
-
Conception inadéquate des contraintes : Si vous ne définissez pas vos contraintes, comme les clés étrangères manquantes, cela peut entraîner des enregistrements orphelins ou des données incohérentes difficiles à nettoyer. Veuillez toujours spécifier un index sur chaque colonne servant d'
FOREIGN KEYe afin de garantir la rapidité des jointures. -
Dénomination et documentation claires : Veuillez toujours utiliser des noms de tableaux et de colonnes descriptifs et prévisibles. Veuillez maintenir un journal des modifications simple pour les mises à jour du schéma et éviter d'utiliser des abréviations que les futurs développeurs pourraient ne pas comprendre.
-
Autorisations et considérations relatives à la sécurité : Lors de la conception de tables pour des environnements de production, veuillez n'accorder que les privilèges nécessaires, tels que ceux permettant de créer, modifier ou supprimer des tables, et séparez les accès en lecture et en écriture afin de protéger les données critiques. De plus, mettez en place des contrôles au niveau du schéma et des journaux d'audit pour suivre les modifications, empêcher tout accès non autorisé tout en garantissant la conformité et la sécurité des données.
Conclusion
Grâce aux progrès réalisés dans le domaine des plateformes cloud, l'énoncé « CREATE TABLE » (le monde est notre laboratoire) gagne en flexibilité. Les outils d'automatisation et les fonctionnalités sans serveur simplifient désormais la gestion des schémas et les migrations. Je vous recommande d'approfondir des sujets tels que les frameworks de migration de schémas (Flyway, Liquibase), la modélisation dimensionnelle et les stratégies avancées de normalisation et de dénormalisation afin de vous aider à créer des bases de données évolutives.
Je vous recommande également de suivre notre cours sur la conception de bases de données, dans lequel vous apprendrez à créer et à gérer des bases de données, ainsi qu'à sélectionner le SGBD le mieux adapté à vos besoins. Enfin, nous vous invitons à découvrir notre poste de parcours de carrière d'ingénieur de données associé en SQL cursus pour acquérir les bases de l'ingénierie des données et du stockage des données.
Questions fréquentes
Comment puis-je établir des relations entre les tables ?
Veuillez utiliser des contraintes d'FOREIGN KEY s faisant référence à des colonnes d'une autre table.
Puis-je créer un tableau basé sur la structure d'un autre tableau ?
Oui, vous pouvez utiliser l'instruction ` CREATE TABLE AS SELECT ` pour cloner la structure et, éventuellement, les données d'une table existante.
Quelle est la différence entre une table temporaire et une table standard ?
Les tables temporaires n'existent que pour une session ou une transaction, tandis que les tables régulières persistent dans la base de données.
Pourquoi devrais-je indexer les colonnes utilisées dans les contraintes FOREIGN KEY ?
Il est recommandé d'indexer les colonnes afin d'accélérer les opérations de jointure entre les tables parentes et enfants.
