2 votes

Comment concevoir correctement une base de données ? Clés étrangères ou clés secondaires ?

Voici quelques tables génériques, j'essaie de bien comprendre comment configurer correctement les tables des bases de données. Sont-elles correctement configurées ? Je veux pouvoir consulter les articles et les détails des articles d'un utilisateur aussi rapidement que possible. Pour information, dans cet exemple, ItemDetailsX ne partage pas les mêmes champs de données.

Je suis un peu bloqué sur les clés étrangères et les clés secondaires. Quand utilise-t-on une clé secondaire par rapport à une clé étrangère ?

tbl_Users 1:* tbl_Item //relation

tbl_Item 1:1 tbl_ItemDetail1 & tbl_ItemDetail2 // relation

tbl_Item 1:N tbl_ItemDetail3 //releationship

tbl_Utilisateurs

-UserID - PK

tbl_Item

-ItemID - PK

-UserID - FK

tbl_ItemDetail1

-ItemDetail1ID - PK //De quoi ai-je besoin si j'ai ItemID ? Il s'agit d'une relation 1:1 avec

-ItemID - FK

-Comte

-Durée

-Fréquence

tbl_ItemDetail2

-ItemDetail2ID - PK //De quoi ai-je besoin si j'ai ItemID ? Il s'agit d'une relation 1:1 avec

-ItemID - FK

-OnOff

-Température

-Tension

tbl_ItemDetail3

-ItemDetail3ID - PK /A une relation 1:N

-ItemID - FK

-Valeur contournée1

-Valorisation contestée2

EDIT :

Merci pour les réponses, j'ai mis à jour mon message original pour refléter correctement ma base de données.

Dans la base de données que je suis en train de créer, l'élément a ~9 détails d'élément. Chaque détail est composé de 5 à 15 colonnes de données.

Avoir une table avec 100 colonnes n'a pas de sens... ?

7voto

Branko Dimitrijevic Points 28493

Les bases de données appliquent trois types d'intégrité déclarative :

  • Intégrité de domaine - le type du champ et la contrainte CHECK.
  • Intégrité de clé - Contrainte PRIMARY KEY ou UNIQUE.
  • Référentiel integrity - FOREIGN KEY.

A clé identifie de manière unique les lignes de la table. Toutes les clés sont logiquement équivalentes, mais pour des raisons pratiques, l'une d'entre elles est choisie comme "primaire" et les autres sont considérées comme "alternatives" (il y a quelques complications impliquant les NULL, mais ne nous y attardons pas ici).

D'autre part, une FOREIGN KEY est une sorte de "pointeur" d'une table à une autre, où le SGBD lui-même garantit que ce "pointeur" ne peut jamais "dangle" . La clé étrangère références la clé (primaire ou alternative) de la table "parent", mais le point de terminaison "enfant" n'a pas besoin d'être lui-même une clé (et ne l'est généralement pas).

  • Lorsqu'une ligne est modifiée ou supprimée de la table parente, ce changement est soit en cascade à la table fille (ON [UPDATE/DELETE] [CASCADE/SET NULL/SET DEFAULT]) ou l'opération entière est bloquée (ON [UPDATE/DELETE] RESTRICT).
  • Si un enfant est inséré ou modifié, il est vérifié par rapport à la table parente pour s'assurer que cette nouvelle valeur y existe.

Les contraintes modifient le signification de données. Indices d'autre part, ne changent pas la signification des données - ils sont là uniquement pour permettre à l'utilisateur de s'exprimer. performance raisons. Certaines bases de données vous permettent même d'avoir une clé sans index sous-jacent, bien que ce soit généralement une mauvaise idée du point de vue des performances. Un index sous-jacent à la clé primaire est appelé "index primaire" et tous les autres index sont "secondaires".

BTW, il y a "index secondaire" et il y a "clé alternative", mais il n'existe pas de "clé secondaire".


Je ne sais pas exactement quel est votre objectif de conception, mais je suppose que quelque chose comme ceci serait un bon point de départ :

enter image description here

Je ne vois pas l'intérêt d'extraire les détails dans des tableaux séparés. si ils sont toujours en relation 1:1 avec l'objet.


--- EDIT ---

Certaines questions que vous devrez vous poser avant de pouvoir arriver à une conception optimale de la base de données :

Existe-t-il une véritable relation 1:1 entre l'élément et le détail ou est-ce en fait 1:0..1 (c'est-à-dire que certains détails sont facultatifs ?).

  • Si c'est 1:1, l'utilisation de colonnes est la représentation la plus naturelle. D'ailleurs, un SGBD décent n'aura aucun mal à gérer 100 colonnes.
  • Si 1:0..1, vous devrez décider d'utiliser des colonnes pouvant contenir des NULL ou des tables séparées. Gardez à l'esprit que la plupart des SGBD sont très efficaces dans le stockage des NULL (typiquement juste un petit bitmap par ligne), donc séparer les données dans une table différente ne vous apportera pas grand chose, et en fait peut empirer substantiellement les performances des requêtes à cause du besoin accru de JOINing.

Tous les types de détails sont-ils prédéterminés (c'est-à-dire que vous pouvez dire en toute confiance que vous n'aurez pas besoin d'ajouter de nouvelles fonctionnalités à votre système d'information). types de détails plus tard dans le cycle de vie de l'application) ?

  • Si oui, utilisez simplement des colonnes.
  • Si ce n'est pas le cas, l'ajout de colonnes dans la grande base de données existante peut s'avérer coûteux. C'est à vous de déterminer si ce coût est suffisant pour justifier l'utilisation d'une table séparée.

Vous pouvez également envisager de généraliser tous les détails sous forme de paires nom/valeur et de les représenter dans une seule table 1:N (non représentée ici). Cette méthode est très souple et "évolutive", mais elle présente ses propres problèmes.

Comment comptez-vous interroger les données ? Il s'agit d'un élément important qui peut influencer considérablement le choix de l'approche "colonnes" ou "table séparée", l'indexation, etc...


BTW, le 1:0..1 avec des tables séparées peut être modélisé comme ceci...

enter image description here

...et le 1:1 peut être modélisé comme ceci...

enter image description here

...mais cela introduit une dépendance circulaire qui doit être gérée d'une manière spéciale (généralement par le biais de différer l'une des FOREIGN KEYs).

Les détails à l'échelle 1:N, bien sûr, sont une autre affaire et sont naturellement modélisés par des tableaux séparés.


Puisque vous dites que "détail 1" et "détail 2" sont 1 :(0..)1 et que "détail 3" est 1:N, votre modèle de données "mis à jour" ressemblerait probablement à quelque chose comme ceci :

enter image description here

BTW, le modèle ci-dessus utilise identifier qui donnent lieu à des clés plus "naturelles". Non-identifiant L'approche relations / clés de substitution ressemblerait à ceci :

enter image description here

Chaque approche a ses avantages, mais ce billet devient déjà un peu long ;) ...

0voto

Cape Cod Gunny Points 2429

Il n'est pas possible de répondre à votre question en un simple message de l'OS. Il y a beaucoup de choses à prendre en compte lors de la création d'une base de données. La meilleure chose que j'ai faite pour apprendre les bases de données et comment les créer a été de lire un livre intitulé "Database Design For Mere Mortals" écrit par Michael Hernandez.

Voir mon billet sur les programmeurs à la question Comment abordez-vous la conception de la base de données ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X