0

Par exemple, j'ai une table qui stocke des classes et une table qui stocke class_attributes. class_attributes a un class_attribute_id et un class_id, alors que classes a un class_id. Je suppose que si un jeu de données est "un enfant unique de" ou "appartient uniquement à" ou "appartient uniquement à", alors j'ai besoin d'un FK pour identifier le parent. Sans class_id dans la table class_attributes je ne pourrais jamais savoir à quelle classe appartient cet attribut.Existe-t-il une matrice de réponses que je peux utiliser pour décider si j'ai besoin d'une clé étrangère ou non?

Peut-être y a-t-il une matrice de réponses utile pour cela?

Répondre

1

Wikipedia est utile.

Dans le contexte des bases de données relationnelles , une clé étrangère est une contrainte de référentiel entre deux tables . 1 La clé étrangère identifie une colonne ou un ensemble de colonnes dans une table (référençant) faisant référence à une colonne ou un ensemble de colonnes dans une autre table (référencée). Les colonnes de la table de référence doivent être la clé principale ou une autre clé candidate dans la table référencée .

(et il se poursuit dans de plus en plus de détails)

Si vous souhaitez appliquer la contrainte que chaque ligne class_attributes applique exactement une rangée de classes, vous avez besoin d'une clé étrangère. Si vous ne vous souciez pas de l'appliquer (c'est-à-dire, vous pouvez utiliser des attributs pour des classes inexistantes), vous n'avez pas besoin d'un FK.

0

Ne vous préoccupez pas du type de relation - cela a plus à voir avec la cardinalité de la relation. Si vous avez une relation un-à-plusieurs, vous souhaitez affecter une clé primaire à la plus petite des tables et la stocker en tant que clé étrangère dans la table plus grande.

Vous le feriez aussi avec des relations un-à-un, mais certaines personnes soutiennent que vous devriez les éviter.

Dans le cas d'une relation plusieurs-à-plusieurs, vous souhaitez créer une table de jointure, puis chaque table d'origine doit avoir une clé étrangère dans la table de jointure.

1

Je dirais que c'est l'inverse. D'abord, vous concevez quel genre d'objets vous devez avoir. Pour ceux qui vont créer une table.

Une partie de cette phase consiste à concevoir les clés, c'est-à-dire les combinaisons d'attributs (colonnes) qui identifient l'objet de manière unique. Vous pouvez ou non ajouter une clé artificielle ou une clé de substitution pour des raisons de commodité ou de performance.De ces clés, vous choisissez généralement une clé canonique, la clé primaire, que vous essayez d'utiliser systématiquement pour identifier les objets de cette table (vous gardez les autres clés, elles servent à assurer l'unicité comme règle métier, pas tellement pour l'identification) fins.)

Ensuite, vous pensez quelles relations existent entre les objets. Un objet qui est «détenu» par un autre objet ou un objet qui fait référence à un autre objet a besoin d'un moyen d'identifier son objet associé. Dans la table correspondante (table enfant), vous ajoutez des colonnes pour que la clé étrangère pointe vers la clé primaire de la table référencée.

Cela prend en charge toutes les relations un à plusieurs. Parfois, un objet peut être associé plusieurs fois à un autre objet. Par exemple, une commande peut être utilisée pour commander plusieurs produits, mais un produit peut également apparaître sur plusieurs commandes. Pour ces relations, vous créez une table distincte (table d'intersection - dans cet exemple, order_items). Cette table aura une clé unique créée à partir de deux clés étrangères: l'une pointant vers l'un des parents (commandes), l'autre vers l'autre parent (produits). Et encore, vous ajoutez les colonnes à la table d'intersection dont vous avez besoin pour créer ces clés étrangères. Donc, en bref, vous devez d'abord concevoir les clés et les clés étrangères, seulement alors vous commencez à ajouter des colonnes pour les implémenter.

+0

Vous pouvez trouver cet article utile aussi http://stackoverflow.com/questions/1979522/how-to-fetch-an-object-graph-at-once/1979549#1979549 –