Les applications Web peuvent être divisées en deux composants principaux: un serveur frontal qui affiche et collecte des informations et un serveur principal pour le stockage des informations. Dans cet article, je vais démontrer ce qu'est une base de données relationnelle et comment concevoir correctement votre base de données pour stocker les informations de votre application..
Une base de données stocke les données de manière organisée afin de pouvoir les rechercher et les récupérer ultérieurement. Il devrait contenir un ou plusieurs tableaux. Un tableau ressemble beaucoup à un tableur, en ce sens qu'il se compose de lignes et de colonnes. Toutes les lignes ont les mêmes colonnes et chaque colonne contient les données elles-mêmes. Si cela vous aide, pensez à vos tableaux de la même manière qu’un tableau dans Excel..
Fig. 1
Les données peuvent être insérées, récupérées, mises à jour et supprimées d'une table. Le mot, créé, est généralement utilisé au lieu de inséré, donc, collectivement, ces quatre fonctions sont affectueusement abrégées en CRUD.
Une base de données relationnelle est un type de base de données qui organise les données dans des tables et les relie, en fonction de relations définies. Ces relations vous permettent d'extraire et de combiner les données d'une ou de plusieurs tables avec une seule requête..
Mais c'était juste un tas de mots. Pour vraiment comprendre une base de données relationnelle, vous devez en créer une vous-même. Commençons par obtenir de vraies données avec lesquelles nous pouvons travailler.
Dans l’esprit des articles clonés Nettuts + Twitter (PHP, Ruby on Rails, Django), obtenons des données Twitter. J'ai cherché Twitter pour "#databases" et pris l'échantillon suivant de dix tweets:
Tableau 1
nom complet | Nom d'utilisateur | texte | créé à | nom_utilisateur suivant |
---|---|---|---|---|
"Boris Hadjur" | "_DreamLead" | "Que pensez-vous de #mailing #campaigns #traffic in #USA? Est-ce un bon marché aujourd'hui? Avez-vous #databases?" | "Mardi, 12 février 2013 08:43:09 +0000" | "Scootmedia", "MetiersInternet" |
"Gunnar Svalander" | "GunnarSvalander" | "Bases de données Bill Gates, logiciel libre sur Reddit http://t.co/ShX4hZlA #billgates #databases" | "Mardi, 12 février 2013 07:31:06 +0000" | "klout", "zillow" |
"Logiciel GE" | "Logiciel GE" | "RT @KirkDBorne: Lectures dans # Base de données: excellente liste de lectures, plusieurs catégories: http://t.co/S6RBUNxq via @rxin Fascinating." | "Mardi, 12 février 2013 07:30:24 +0000" | "DayJobDoc", "byosko" |
"Adrian Burch" | "adrianburch" | "RT @tisakovich: @NimbusData à la conférence @Barclays Big Data à San Francisco aujourd'hui, parlant de la virtualisation, des # bases de données et de la mémoire flash." | "Mardi, 12 février 2013 06:58:22 +0000" | "CindyCrawford", "Arjantim" |
"Andy Ryder" | "AndyRyder5" | "Article http://t.co/D3KOJIvF sur Madden 2013 utilisant l'IA pour produire le super bowl #databases # bus311" | "Mardi, 12 février 2013 05:29:41 +0000" | "MichaelDell", "Yahoo" |
"Andy Ryder" | "AndyRyder5" | "http://t.co/rBhBXjma un article sur les paramètres de confidentialité et facebook #databases # bus311" | "Mardi, 12 février 2013 05:24:17 +0000" | "MichaelDell", "Yahoo" |
"Brett Englebert" | "Brett_Englebert" | "# BUS311 Le NCFPD de l'Université du Minnesota crée #databases pour prévenir la" fraude alimentaire ". Http://t.co/0LsAbKqJ" | "Mardi, 12 février 2013 01:49:19 +0000" | "RealSkipBayless", "stephenasmith" |
Brett Englebert | "Brett_Englebert" | "Les sociétés # BUS311 pourraient protéger leurs bases de données de production, mais qu'en est-il de leurs fichiers de sauvegarde? Http://t.co/okJjV3Bm" | "Mardi, 12 février 2013 01:31:52 +0000" | "RealSkipBayless", "stephenasmith" |
"Nimbus Data Systems" | "NimbusData" | "@NimbusData CEO @tisakovich @BarclaysOnline conférence à San Francisco aujourd'hui, parlant de" virtualisation, # bases de données, & #flash mémoire " | "Lun., 11 février 2013 23:15:05 +0000" | "dellock6", "rohitkilam" |
"SSWUG.ORG" | "SSWUGorg" | "N'oubliez pas de vous inscrire à notre exposition GRATUITE ce vendredi: #Databases, #BI et #Sharepoint: Ce que vous devez savoir! Http://t.co/Ijrqrz29" | "Lun., 11 février 2013 22:15:37 +0000" | "drsql", "steam_games" |
Voici ce que chaque nom de colonne signifie:
MySQL est utilisé dans presque toutes les sociétés Internet dont vous avez entendu parler..
Ce sont toutes des données réelles; vous pouvez rechercher Twitter et trouver réellement ces tweets.
C'est bon. Les données sont toutes au même endroit. il est donc facile à trouver, non? Pas exactement. Il y a quelques problèmes avec cette table. Premièrement, il y a des données répétitives sur les colonnes. Les colonnes "nom d'utilisateur" et "nom d'utilisateur suivant" sont répétitives, car elles contiennent toutes deux le même type de données: les poignées Twitter. Il existe une autre forme de répétition dans la colonne "nom_utilisateur suivant". Les champs ne doivent contenir qu’une seule valeur, mais chacun des champs "nom_utilisateur suivant" en contient deux..
Deuxièmement, il y a des données répétitives sur les lignes.
@ AndyRyder5 et @Brett_Englebert ont chacun tweeté deux fois, le reste de leurs informations a donc été dupliqué.
Les doublons sont problématiques car cela rend les opérations CRUD plus difficiles. Par exemple, la récupération des données prendrait plus de temps car le temps perdu à parcourir des lignes en double. En outre, la mise à jour des données serait un problème; si un utilisateur change son pseudo Twitter, il nous faudra trouver chaque duplicata et le mettre à jour.
Les données répétitives sont un problème. Nous pouvons résoudre ce problème en scindant Tableau 1 en tableaux séparés. Commençons d'abord par résoudre le problème de répétition sur plusieurs colonnes.
Comme indiqué ci-dessus, les colonnes "nom d'utilisateur" et "nom d'utilisateur suivant" dans Tableau 1 sont répétitifs. Cette répétition s’est produite parce que j’essayais d’exprimer la relation de suivi entre les utilisateurs. Améliorons Tableau 1La conception de en divisant en deux tables: une pour les relations suivantes et une pour le reste de l'information.
Fig. 2
Parce que @Brett_Englebert suit @RealSkipBayless, le Suivant table exprimera cette relation en stockant @Brett_Englebert sous le nom "from_user" et @RealSkipBayless en tant que "to_user". Allons-y et divisons Tableau 1 dans ces deux tables:
Tableau 2: Le Suivant table
from_user | à l'utilisateur |
---|---|
_DreamLead | Scootmedia |
_DreamLead | MetiersInternet |
GunnarSvalander | Klout |
GunnarSvalander | zillow |
Logiciel GE | DayJobDoc |
Logiciel GE | Byosko |
adrianburch | Cindy Crawford |
adrianburch | Arjantim |
AndyRyder | MichaelDell |
AndyRyder | Yahoo |
Brett_Englebert | RealSkipBayless |
Brett_Englebert | Stephenasmith |
NimbusData | dellock6 |
NimbusData | Rohitkilam |
SSWUGorg | drsql |
SSWUGorg | steam_games |
Tableau 3: Le utilisateurs table
nom complet | Nom d'utilisateur | texte | créé à |
---|---|---|---|
"Boris Hadjur" | "_DreamLead" | "Que pensez-vous de #mailing #campaigns #traffic in #USA? Est-ce un bon marché aujourd'hui? Avez-vous #databases?" | "Mardi, 12 février 2013 08:43:09 +0000" |
"Gunnar Svalander" | "GunnarSvalander" | "Bases de données Bill Gates, logiciel libre sur Reddit http://t.co/ShX4hZlA #billgates #databases" | "Mardi, 12 février 2013 07:31:06 +0000" |
"Logiciel GE" | "Logiciel GE" | "RT @KirkDBorne: Lectures dans # Base de données: excellente liste de lectures, plusieurs catégories: http://t.co/S6RBUNxq via @rxin Fascinating." | "Mardi, 12 février 2013 07:30:24 +0000" |
"Adrian Burch" | "adrianburch" | "RT @tisakovich: @NimbusData à la conférence @Barclays Big Data à San Francisco aujourd'hui, parlant de la virtualisation, des # bases de données et de la mémoire flash." | "Mardi, 12 février 2013 06:58:22 +0000" |
"Andy Ryder" | "AndyRyder5" | "Article http://t.co/D3KOJIvF sur Madden 2013 utilisant l'IA pour produire le super bowl #databases # bus311" | "Mardi, 12 février 2013 05:29:41 +0000" |
"Andy Ryder" | "AndyRyder5" | "http://t.co/rBhBXjma un article sur les paramètres de confidentialité et facebook #databases # bus311" | "Mardi, 12 février 2013 05:24:17 +0000" |
"Brett Englebert" | "Brett_Englebert" | "# BUS311 Le NCFPD de l'Université du Minnesota crée #databases pour prévenir la" fraude alimentaire ". Http://t.co/0LsAbKqJ" | "Mardi, 12 février 2013 01:49:19 +0000" |
Brett Englebert | "Brett_Englebert" | "Les sociétés # BUS311 pourraient protéger leurs bases de données de production, mais qu'en est-il de leurs fichiers de sauvegarde? Http://t.co/okJjV3Bm" | "Mardi, 12 février 2013 01:31:52 +0000" |
"Nimbus Data Systems" | "NimbusData" | "@NimbusData CEO @tisakovich @BarclaysOnline conférence à San Francisco aujourd'hui, parlant de" virtualisation, # bases de données, & #flash mémoire " | "Lun., 11 février 2013 23:15:05 +0000" |
"SSWUG.ORG" | "SSWUGorg" | "N'oubliez pas de vous inscrire à notre exposition GRATUITE ce vendredi: #Databases, #BI et #Sharepoint: Ce que vous devez savoir! Http://t.co/Ijrqrz29" | "Lun., 11 février 2013 22:15:37 +0000" |
Cela semble mieux. Maintenant dans le utilisateurs table (Tableau 3), il n'y a qu'une seule colonne avec des poignées Twitter. dans le Suivant table (Tableau 2), il n’existe qu’un seul identifiant Twitter par champ dans la colonne "to_user".
Edgar F. Codd, l'informaticien qui a posé les bases théoriques des bases de données relationnelles, a appelé cette étape de suppression des données répétitives sur les colonnes la première forme normale (1NF).
Maintenant que nous avons corrigé les répétitions sur les colonnes, nous devons corriger les répétitions sur les lignes. Les utilisateurs @ AndyRyder5 et @Brett_Englebert ayant chacun tweeté deux fois, leurs informations sont dupliquées dans le utilisateurs table (Tableau 3). Cela indique que nous devons extraire les tweets et les placer dans leur propre table..
Fig. 3
Comme auparavant, "text" stocke le tweet lui-même. Étant donné que la colonne "created_at" stocke l'horodatage du tweet, il est judicieux de l'insérer également dans cette table. J'inclus également une référence à la colonne "nom d'utilisateur" afin que nous sachions qui a publié le tweet. Voici le résultat de placer les tweets dans leur propre tableau:
Tableau 4: Le tweets table
texte | créé à | Nom d'utilisateur |
---|---|---|
"Que pensez-vous de #mailing #campaigns #traffic in #USA? Est-ce un bon marché aujourd'hui? Avez-vous #databases?" | "Mardi, 12 février 2013 08:43:09 +0000" | "_DreamLead" |
"Bases de données Bill Gates, logiciel libre sur Reddit http://t.co/ShX4hZlA #billgates #databases" | "Mardi, 12 février 2013 07:31:06 +0000" | "GunnarSvalander" |
"RT @KirkDBorne: Lectures dans # Base de données: excellente liste de lectures, plusieurs catégories: http://t.co/S6RBUNxq via @rxin Fascinating." | "Mardi, 12 février 2013 07:30:24 +0000" | "Logiciel GE" |
"RT @tisakovich: @NimbusData à la conférence @Barclays Big Data à San Francisco aujourd'hui, parlant de la virtualisation, des # bases de données et de la mémoire flash." | "Mardi, 12 février 2013 06:58:22 +0000" | "adrianburch" |
"Article http://t.co/D3KOJIvF sur Madden 2013 utilisant l'IA pour produire le super bowl #databases # bus311" | "Mardi, 12 février 2013 05:29:41 +0000" | "AndyRyder5" |
"http://t.co/rBhBXjma un article sur les paramètres de confidentialité et facebook #databases # bus311" | "Mardi, 12 février 2013 05:24:17 +0000" | "AndyRyder5" |
"# BUS311 Le NCFPD de l'Université du Minnesota crée #databases pour prévenir la" fraude alimentaire ". Http://t.co/0LsAbKqJ" | "Mardi, 12 février 2013 01:49:19 +0000" | "Brett_Englebert" |
"Les sociétés # BUS311 pourraient protéger leurs bases de données de production, mais qu'en est-il de leurs fichiers de sauvegarde? Http://t.co/okJjV3Bm" | "Mardi, 12 février 2013 01:31:52 +0000" | "Brett_Englebert" |
"@NimbusData CEO @tisakovich @BarclaysOnline conférence à San Francisco aujourd'hui, parlant de" virtualisation, # bases de données, & #flash mémoire " | "Lun., 11 février 2013 23:15:05 +0000" | "NimbusData" |
"N'oubliez pas de vous inscrire à notre exposition GRATUITE ce vendredi: #Databases, #BI et #Sharepoint: Ce que vous devez savoir! Http://t.co/Ijrqrz29" | "Lun., 11 février 2013 22:15:37 +0000" | "SSWUGorg" |
Tableau 5: Le utilisateurs table
nom complet | Nom d'utilisateur |
---|---|
"Boris Hadjur" | "_DreamLead" |
"Gunnar Svalander" | "GunnarSvalander" |
"Logiciel GE" | "Logiciel GE" |
"Adrian Burch" | "adrianburch" |
"Andy Ryder" | "AndyRyder5" |
"Brett Englebert" | "Brett_Englebert" |
"Nimbus Data Systems" | "NimbusData" |
"SSWUG.ORG" | "SSWUGorg" |
Après la scission, le utilisateurs table (Tableau 5) a des lignes uniques pour les utilisateurs et leurs pseudonymes Twitter.
Edgar F. Codd a appelé cette étape de suppression des données répétitives sur les lignes la deuxième forme normale (1NF).
Les données peuvent être insérées, récupérées, mises à jour et supprimées d'un tableau.
Jusque là, Tableau 1 a été divisé en trois nouvelles tables: Suivant (Tableau 2), tweets (Tableau 4), et utilisateurs (Tableau 5). Mais comment est-ce utile? Les données répétitives ont été supprimées, mais les données sont maintenant réparties dans trois tables indépendantes. Afin de récupérer les données, nous devons établir des liens significatifs entre les tables. De cette façon, nous pouvons exprimer des questions telles que "ce qu'un utilisateur a tweeté et qui il suit".
Pour tracer des liens entre les tables, vous devez d'abord attribuer à chaque ligne d'un identifiant unique, appelé clé primaire, puis référencer cette clé primaire dans l'autre table à laquelle vous souhaitez créer un lien..
Nous avons déjà fait cela dans utilisateurs (Tableau 5) et tweets (Tableau 4). Dans utilisateurs, la clé primaire est la colonne "nom d'utilisateur", car deux utilisateurs n'auront pas le même identifiant Twitter. Dans tweets, nous référons cette clé dans la colonne "nom d'utilisateur" afin de savoir qui a tweeté quoi. Puisqu'il s'agit d'une référence, la colonne "nom d'utilisateur" dans tweets s'appelle une clé étrangère. De cette façon, la clé "nom d'utilisateur" relie le utilisateurs et tweets tables ensemble.
La colonne "nom d'utilisateur" est-elle la meilleure idée d'une clé primaire pour le utilisateurs table?
D'une part, il s'agit d'une clé naturelle: il est judicieux d'effectuer une recherche à l'aide d'un pseudo Twitter au lieu d'attribuer à chaque utilisateur un identifiant numérique et d'effectuer une recherche sur celui-ci. D'autre part, que se passe-t-il si un utilisateur veut changer son pseudo Twitter? Cela pourrait provoquer des erreurs si la clé primaire et toutes les clés étrangères référençant ne sont pas mises à jour avec précision, erreurs qui pourraient être évitées si un ID numérique constant était utilisé. En fin de compte, le choix dépend de votre système. Si vous voulez donner à vos utilisateurs la possibilité de changer leur nom d'utilisateur, il est préférable d'ajouter une colonne "id" à incrémentation automatique numérique. utilisateurs et l'utiliser comme clé primaire. Sinon, "nom d'utilisateur" devrait très bien faire l'affaire. Je vais continuer à utiliser "nom d'utilisateur" comme clé primaire pour utilisateurs
Passons à tweets (Tableau 4). Une clé primaire doit identifier chaque ligne de manière unique. Que doit donc contenir la clé primaire? Le champ "created_at" ne fonctionnera pas, car si deux utilisateurs tweetaient exactement au même moment, leurs tweets auraient un horodatage identique. Le "texte" a le même problème en ce que si deux utilisateurs tweetent "Bonjour tout le monde", nous ne pouvons pas distinguer les lignes. La colonne "nom d'utilisateur" est la clé étrangère qui définit le lien avec le utilisateurs alors ne jouons pas avec ça. Puisque les autres colonnes ne sont pas de bons candidats, il est logique d'ajouter une colonne "id" numérique à incrémentation automatique et de l'utiliser comme clé primaire..
Tableau 6: Le tweets table avec une colonne "id"
identifiant | texte | créé à | Nom d'utilisateur |
---|---|---|---|
1 | "Que pensez-vous de #mailing #campaigns #traffic in #USA? Est-ce un bon marché aujourd'hui? Avez-vous #databases?" | "Mardi, 12 février 2013 08:43:09 +0000" | "_DreamLead" |
2 | "Bases de données Bill Gates, logiciel libre sur Reddit http://t.co/ShX4hZlA #billgates #databases" | "Mardi, 12 février 2013 07:31:06 +0000" | "GunnarSvalander" |
3 | "RT @KirkDBorne: Lectures dans # Base de données: excellente liste de lectures, plusieurs catégories: http://t.co/S6RBUNxq via @rxin Fascinating." | "Mardi, 12 février 2013 07:30:24 +0000" | "Logiciel GE" |
4 | "RT @tisakovich: @NimbusData à la conférence @Barclays Big Data à San Francisco aujourd'hui, parlant de la virtualisation, des # bases de données et de la mémoire flash." | "Mardi, 12 février 2013 06:58:22 +0000" | "adrianburch" |
5 | "Article http://t.co/D3KOJIvF sur Madden 2013 utilisant l'IA pour produire le super bowl #databases # bus311" | "Mardi, 12 février 2013 05:29:41 +0000" | "AndyRyder5" |
6 | "http://t.co/rBhBXjma un article sur les paramètres de confidentialité et facebook #databases # bus311" | "Mardi, 12 février 2013 05:24:17 +0000" | "AndyRyder5" |
7 | "# BUS311 Le NCFPD de l'Université du Minnesota crée #databases pour prévenir la" fraude alimentaire ". Http://t.co/0LsAbKqJ" | "Mardi, 12 février 2013 01:49:19 +0000" | "Brett_Englebert" |
8 | "Les sociétés # BUS311 pourraient protéger leurs bases de données de production, mais qu'en est-il de leurs fichiers de sauvegarde? Http://t.co/okJjV3Bm" | "Mardi, 12 février 2013 01:31:52 +0000" | "Brett_Englebert" |
9 | "@NimbusData CEO @tisakovich @BarclaysOnline conférence à San Francisco aujourd'hui, parlant de" virtualisation, # bases de données, & #flash mémoire " | "Lun., 11 février 2013 23:15:05 +0000" | "NimbusData" |
dix | "N'oubliez pas de vous inscrire à notre exposition GRATUITE ce vendredi: #Databases, #BI et #Sharepoint: Ce que vous devez savoir! Http://t.co/Ijrqrz29" | "Lun., 11 février 2013 22:15:37 +0000" | "SSWUGorg" |
Enfin, ajoutons une clé primaire à la Suivant table. Dans cette table, ni la colonne "from_user" ni la colonne "to_user" n'identifient de manière unique chaque ligne. Cependant, "from_user" et "to_user" ensemble, car ils représentent une relation unique. Une clé primaire peut être définie sur plusieurs colonnes. Nous allons donc utiliser ces deux colonnes comme clé primaire pour Suivant table.
Quant à la clé étrangère, "from_user" et "to_user" sont chacune des clés étrangères puisqu'elles peuvent être utilisées pour définir un lien avec le utilisateurs table. Si nous demandons un identifiant Twitter sur la colonne "from_user", nous obtiendrons tous les utilisateurs qu’il suit. De même, si nous demandons un identifiant Twitter sur la colonne "to_user", tous les utilisateurs le suivront..
Nous avons accompli beaucoup de choses jusqu'à présent. Nous avons supprimé les répétitions sur les colonnes et les lignes en séparant les données dans trois tables différentes, puis nous avons choisi des clés primaires significatives pour lier les tables. L'ensemble de ce processus s'appelle la normalisation et génère des données clairement organisées selon le modèle relationnel. La conséquence de cette organisation est que les lignes n'apparaîtront dans la base de données qu'une seule fois, ce qui facilite les opérations CRUD..
Fig. 4 schématise le schéma de base de données finalisé. Les trois tables sont liées et les clés primaires sont en surbrillance.
Fig. 4
Il existe de petites variations en SQL entre chaque fournisseur de SGBDR, appelées dialectes SQL.
Maintenant que nous savons comment concevoir une base de données relationnelle, comment en implémentons-nous une? Les systèmes de gestion de base de données relationnelle (SGBDR) sont des logiciels qui vous permettent de créer et d'utiliser des bases de données relationnelles. Il existe plusieurs fournisseurs commerciaux et open source parmi lesquels choisir. Sur le plan commercial, Oracle Database, IBM DB2 et Microsoft SQL Server sont trois solutions bien connues. MySQL, SQLite et PostgreSQL sont trois solutions largement utilisées du côté libre et open source..
MySQL est utilisé par presque toutes les sociétés Internet dont vous avez entendu parler. Dans le contexte de cet article, Twitter utilise MySQL pour stocker les tweets de leurs utilisateurs..
SQLite est commun dans les systèmes embarqués. iOS et Android permettent aux développeurs d'utiliser SQLite pour gérer la base de données privée de leur application. Google Chrome utilise SQLite pour stocker votre historique de navigation, vos cookies et vos vignettes sur la page "Les plus visités"..
PostgreSQL est également un SGBDR largement utilisé. Son extension PostGIS complète PostgreSQL avec des fonctions géospatiales qui le rendent utile pour les applications de mappage. OpenStreetMap est un utilisateur connu de PostgreSQL..
Une fois que vous avez téléchargé et configuré un SGBDR sur votre système, l'étape suivante consiste à créer une base de données et des tables à l'intérieur de celle-ci afin d'insérer et de gérer vos données relationnelles. Pour ce faire, vous utilisez le langage SQL (Structured Query Language), qui est le langage standard pour travailler avec des SGBDR..
Voici un bref aperçu des instructions SQL courantes pertinentes pour les exemples de données Twitter ci-dessus. Je vous recommande de consulter le livre de recettes SQL pour une liste plus complète de requêtes SQL orientées applications..
Développement CREATE DATABASE;
CREATE TABLE utilisateurs (nom complet VARCHAR (100), nom d'utilisateur VARCHAR (100));
Les SGBDR exigent qu'un type de données soit attribué à chaque colonne d'une table. Ici, j'ai assigné les colonnes "nom complet" et "nom d'utilisateur" au type de données VARCHAR
qui est une chaîne qui peut varier en largeur. J'ai arbitrairement fixé une longueur maximale de 100. Vous trouverez une liste complète des types de données ici..
INSERT INTO users (nom complet, nom d'utilisateur) VALUES ("Boris Hadjur", "_DreamLead");
SÉLECTIONNER le texte, created_at FROM tweets WHERE username = "_ DreamLead";
UPDATE utilisateurs SET full_name = "Boris H" WHERE nomutilisateur = "_ DreamLead";
SUPPRIMER DES UTILISATEURS WHERE nomutilisateur = "_ DreamLead";
SQL est assez similaire aux phrases anglaises normales. Il existe de petites variations dans le langage SQL entre chaque fournisseur de SGBDR, appelées dialectes SQL, mais les différences ne sont pas suffisamment importantes pour que vous ne puissiez pas facilement transférer vos connaissances en SQL de l'un à l'autre..
Dans cet article, nous avons appris à concevoir une base de données relationnelle. Nous avons pris une collection de données et les avons organisées en tables connexes. Nous avons également brièvement examiné les solutions SGBDR et SQL. Alors commencez par télécharger un SGBDR et normaliser certaines de vos données dans une base de données relationnelle aujourd'hui.
Image de prévisualisation Source: FindIcons.com/Barry Mieny