Disons que j'ai une table appelée User_FriendList
, qui présente les caractéristiques suivantes:
CREATE TABLE User_FriendList (
ID ...,
User_ID...,
FriendList_IDs...,
CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID)
);
Et supposons que cette table contient les données suivantes:
+ ---- + --------- + --------------------------- + | ID | ID_utilisateur | Friendlist_IDs | + ---- + --------- + --------------------------- + | 1 | 102 | 2: 15: 66: 35: 26: 17: | + ---- + --------- + --------------------------- + | 2 | 114 | 1: 12: 63: 33: 24: 16: 102 | + ---- + --------- + --------------------------- + | 3 | 117 | 6: 24: 52: 61: 23: 90: 97: 118 | + ---- + --------- + --------------------------- +
Remarque: Le «:» (deux-points) est le délimiteur lors de l' explosion en PHP dans un array
.
Des questions
Donc:
Est-ce un moyen pratique de «stocker»
IDs
unFriendList
?Ou, au lieu de cela, dois-je avoir des lignes individuelles avec une seule
FriendId
valeur dans chacune d'elles et, lorsque j'ai besoin de récupérer toutes les lignes d'une liste donnée , il suffit d'effectuer une requête commeSELECT * FROM UserFriendList WHERE UserId = 1
?
Réponses:
Gérer une information individuelle
En supposant que, dans votre domaine d'activité,
puis chaque donnée spécifique collectée dans la
Friendlist_IDs
colonne à plusieurs valeurs représente une information distincte qui a une signification très exacte. Par conséquent, ladite colonneRéponse courte
Par conséquent, vous devez conserver chacune des
Friendlist_IDs
valeurs dans (a) une colonne qui accepte exclusivement une seule valeur par ligne dans (b) un tableau qui représente le type d'association au niveau conceptuel qui peut avoir lieu entre les utilisateurs , c'est-à-dire une amitié - comme Je vais illustrer dans les sections suivantes—.De cette façon, vous pourrez gérer (i) ladite table comme une relation mathématique et (ii) ladite colonne comme un attribut de relation mathématique - autant que MySQL et son dialecte SQL le permettent, bien sûr -.
Pourquoi?
Parce que le modèle relationnel de données , créé par Dr. E. F. Codd , exige d'avoir des tables qui sont composées de colonnes qui contiennent exactement une valeur du domaine ou du type applicable par ligne; par conséquent, déclarer un tableau avec une colonne qui peut contenir plus d'une valeur du domaine ou du type en question (1) ne représente pas une relation mathématique et (2) ne permettrait pas d'obtenir les avantages proposés dans le cadre théorique susmentionné.
Modélisation des amitiés entre utilisateurs : définir d'abord les règles de l'environnement commercial
Je recommande fortement de commencer à façonner une base de données délimitant - avant toute autre chose - le schéma conceptuel correspondant en vertu de la définition des règles commerciales pertinentes qui, entre autres facteurs, doivent décrire les types d'interrelations qui existent entre les différents aspects d'intérêt, à savoir , les types d'entités applicables et leurs propriétés ; par exemple:
Diagramme expositoire IDEF1X
De cette manière, j'ai pu dériver le diagramme IDEF1X 1 illustré à la figure 1 , qui intègre la plupart des règles formulées précédemment:
Comme représenté, le demandeur et le destinataire sont des dénotations qui expriment les rôles effectués par les utilisateurs spécifiques qui participent à une amitié donnée .
Cela étant, le type d'entité Amitié représente un type d'association de ratio de cardinalité plusieurs à plusieurs (M: N) qui peut impliquer différentes occurrences du même type d'entité, c'est-à-dire Utilisateur . À ce titre, il s'agit d'un exemple de la construction classique connue sous le nom de «nomenclature» ou «explosion de pièces».
1 La définition d'intégration pour la modélisation de l'information ( IDEF1X ) est une technique hautement recommandable qui a été établie en tant que norme en décembre 1993 par le National Institute of Standards and Technology (NIST)des États-Unis. Il est solidement fondé sur (a) les premiers éléments théoriques rédigés par le seul auteur du modèle relationnel, c'est-à-dire le Dr EF Codd ; sur (b) la vue entité-relation des données, développée par le Dr PP Chen ; et également sur (c) la technique de conception de bases de données logiques, créée par Robert G. Brown.
Conception logique illustrative SQL-DDL
Ensuite, à partir du diagramme IDEF1X présenté ci-dessus, déclarer un arrangement DDL comme celui qui suit est beaucoup plus «naturel»:
Dans cette mode:
Avantages d'une colonne à valeur unique
Comme démontré, vous pouvez, par exemple:
Profitez de l' intégrité référentielle imposée par le système de gestion de base de données (SGBD pour la brièveté) pour la
Friendship.AddresseeId
colonne, car la contraindre en tant que CLÉ ÉTRANGÈRE (FK pour la brièveté) qui fait référence à laUserProfile.UserId
colonne garantit que chaque valeur pointe vers une ligne existante .Créez une CLÉ PRIMAIRE composite (PK) composée de la combinaison de colonnes
(Friendship.RequesterId, Friendship.AddresseeId)
, aidant à distinguer avec élégance toutes les lignes INSÉRÉES et, naturellement, à protéger leur unicité .Bien sûr, cela signifie que l'attachement d'une colonne supplémentaire pour les valeurs de substitution affectées par le système (par exemple, une configuration avec la propriété IDENTITY dans Microsoft SQL Server ou avec l' attribut AUTO_INCREMENT dans MySQL) et l'aide INDEX est entièrement superflue .
Limitez les valeurs retenues
Friendship.AddresseeId
à un type de données précis c (qui doit correspondre, par exemple, à celui établi pourUserProfile.UserId
, dans ce cas INT), en laissant le SGBD se charger de la validation automatique pertinente .Ce facteur peut également aider à (a) utiliser les fonctions de type intégrées correspondantes et (b) optimiser l' utilisation de l' espace disque .
Optimisez la récupération des données au niveau physique en configurant des INDEX subordonnés petits et rapides pour la
Friendship.AddresseeId
colonne, car ces éléments physiques peuvent considérablement aider à accélérer les requêtes qui impliquent ladite colonne.Certes, vous pouvez, par exemple, mettre en place un INDEX à une seule colonne pour
Friendship.AddresseeId
seul, un INDEX à plusieurs colonnes qui englobeFriendship.RequesterId
etFriendship.AddresseeId
, ou les deux.Évitez la complexité inutile introduite par la «recherche» de valeurs distinctes qui sont collectées ensemble dans la même colonne (très probablement dupliquées, mal tapées, etc.), un plan d'action qui finirait par ralentir le fonctionnement de votre système, car vous le feriez doivent recourir à des méthodes non relationnelles consommatrices de temps et de ressources pour accomplir ladite tâche.
Ainsi, il existe plusieurs raisons qui nécessitent d'analyser attentivement l'environnement commercial pertinent afin de marquer avec précision le type d de chaque colonne de tableau.
Comme expliqué, le rôle joué par le concepteur de base de données est primordial pour tirer le meilleur parti (1) des avantages de niveau logique offerts par le modèle relationnel et (2) des mécanismes physiques fournis par le SGBD de choix.
a , b , c , d Evidemment, lorsque vous travaillez avec des plates-formes SQL (par exemple, Firebird et PostgreSQL ) qui prennent en charge la création de DOMAIN (une caractéristique relationnelle distincte), vous pouvez déclarer des colonnes qui n'acceptent que des valeurs qui appartiennent à leurs respectives (convenablement contraintes et parfois DOMAINs partagés).
Un ou plusieurs programmes d'application partageant la base de données considérée
Lorsque vous devez utiliser
arrays
le code du ou des programmes d'application accédant à la base de données, il vous suffit de récupérer l' intégralité du ou des jeux de données pertinents , puis de les «lier» à la structure de code concernée ou d'exécuter le processus (s) d'application associés qui devraient avoir lieu.Autres avantages des colonnes à valeur unique: les extensions de structure de base de données sont beaucoup plus faciles
Un autre avantage du maintien du
AddresseeId
point de données dans sa colonne réservée et correctement typée est qu'il facilite considérablement l'extension de la structure de la base de données, comme je le montrerai ci-dessous.Progression du scénario: intégration du concept de statut d'amitié
Étant donné que les amitiés peuvent évoluer au fil du temps, vous devrez peut-être suivre un tel phénomène, vous devrez donc (i) étendre le schéma conceptuel et (ii) déclarer quelques tables supplémentaires dans la disposition logique. Alors, organisons les prochaines règles métier pour délimiter les nouvelles incorporations:
Diagramme IDEF1X étendu
Successivement, le diagramme IDEF1X précédent peut être étendu afin d'inclure les nouveaux types d'entité et les types d'interrelation décrits ci-dessus. Un diagramme décrivant les éléments précédents associés aux nouveaux est présenté à la figure 2 :
Ajouts de structure logique
Ensuite, nous pouvons allonger la disposition DDL avec les déclarations suivantes:
Par conséquent, chaque fois que le statut d'une amitié donnée doit être mis à jour, les utilisateurs n'auront qu'à INSÉRER une nouvelle
FriendshipStatus
ligne, contenant:les valeurs appropriées
RequesterId
et -AddresseeId
tirées de la ligne concernéeFriendship
-;la
StatusCode
valeur nouvelle et significative - tirée deMyStatus.StatusCode
-;l'instant INSERTion exact, c'est-à-dire
SpecifiedDateTime
- en utilisant de préférence une fonction serveur afin que vous puissiez la récupérer et la conserver de manière fiable -; etla
SpecifierId
valeur qui indiquerait le respectifUserId
qui a entré le nouveauFriendshipStatus
dans le système —idéalement, à l'aide des installations de vos applications—.Dans cette mesure, supposons que le
MyStatus
tableau contient les données suivantes - avec des valeurs PK qui sont (a) compatibles avec l'utilisateur final, le programmeur d'application et DBA et (b) petites et rapides en termes d'octets au niveau de l' implémentation physique -:Ainsi, le
FriendshipStatus
tableau peut contenir des données comme indiqué ci-dessous:Comme vous pouvez le voir, on peut dire que le
FriendshipStatus
tableau sert à constituer une série chronologique .Postes pertinents
Vous pourriez tout aussi bien être intéressé par:
la source