2016-08-23 1 views
0

Pour un projet en utilisant MySQL, j'ai un db qui ressemble à ceci:conception de base de données: colonne redondante vs colonne non utilisée

Tableau 1: colonne A, colonne B, colonne C, colonne D.

tableau 2: colonne A, colonne B, colonne E, colonne F.

Comme vous pouvez le voir les colonnes A et B sont redondants à travers les tables (même type, même type d'information pour chaque table) .

Quelqu'un m'a suggéré de regrouper tout sous une table:

Tableau 1: colonne A, colonne B, C Colonne, Colonne D, Colonne E, Colonne F.

Le problème est que certains de mes articles utilisent les colonnes C et D et d'autres utilisent E et F, donc pour certaines lignes, ces colonnes seront toujours NULL.

Quelle est la pratique recommandée ici? Y a-t-il un design standard à suivre? Qu'en est-il des performances et des ressources (avec des milliers de lignes et ~ 10 tables)?

Un cas a colonnes redondantes et l'autre cas a colonnes non utilisées.

Ou peut-être que je pourrais partager les tables et créer une relation, il donne quelque chose comme:

Tableau 1: colonne A, colonne B.

Tableau 2: colonne A (clé étrangère), la colonne C, colonne D.

Tableau 3: colonne A (clé étrangère), la colonne E, colonne F.

Je suis un peu perdu ici. C'est nouveau pour moi. Merci pour toute contribution.

+3

il n'y a pas de norme. il n'y a que ce qui fonctionne pour vous. –

+3

Vous devez utiliser la conception la mieux adaptée aux besoins de votre entreprise. Puisque nous ne sommes pas de ces exigences, il est assez difficile de recommander une solution pour vous. – Shadow

+0

pourquoi pouvez-vous simplement avoir C, D et Type pour indiquer s'il s'agit d'un CD ou d'un enregistrement de type EF? nulls disparu, et vous êtes avec 4 colonnes 1 table. (ceci suppose qu'un enregistrement ne peut pas être CD et EF cependant) – xQbert

Répondre

3

Si ce sont des relations 1-1, je les collerais dans une seule table pour faciliter l'utilisation. Il n'y a pas de vraie raison pour laquelle vous ne pouvez pas stocker NULLS dans la table. Personnellement, je préfère m'occuper de cela plutôt que d'avoir à gérer la synchronisation des clés entre les deux tables. Le seul avantage majeur que je peux voir en les séparant est que vous pouvez mettre des autorisations différentes sur les différentes tables si vous voulez contrôler le niveau d'information auquel un utilisateur donné a accès. Par exemple, la table A contient l'enregistrement de la personne principale et la table B contient les informations de contact. Bien sûr, vos comptes d'utilisateur standard peuvent y accéder, mais vous ne voulez probablement pas que chaque utilisateur ait accès à la table C qui contient les SSN des utilisateurs.

Si ce sont des relations 1-n, alors vous parlez de quelque chose de complètement différent, et il est clairement préférable de le diviser en plusieurs tables.

+0

Pourquoi le downvote? – Jacobm001

+0

J'ai ajouté un upvote pour l'équilibrer ... Je ne vois rien de mal à ce que vous dites. –

+0

@GrahamNicol Ne fais pas ça. Voter sur le contenu, pas sur les votes. Si vous pensez que le post mérite un upvote, votez en conséquence. Si vous ne pensez pas qu'il mérite une downvote, ce n'est pas à vous de décider. –

0

Cela dépend de votre comportement requête/écriture. Si vous mesurez des milliers de lignes comme vous le dites, cela ne fera pas une grande différence.

Il est peut-être préférable de planifier un schéma autour de ce qui est plus intuitif.De ce point de vue, je préfère voir des données redondantes dans deux tableaux, voir des valeurs nulles partout dans une table.

0

La réponse pas entièrement utile ici est "ça dépend". Vous devriez penser au delà de quelles colonnes les tables tiennent et considérer à quoi les tables seront employées.

Si vous allez extraire les données du Tableau 1 et du Tableau 2 et les présenter dans un seul espace, la clause where reflètera les valeurs de la Colonne A et de la Colonne B alors toutes les données dans une seule table fait le plus de sens.

Si vous ne voulez interroger qu'une seule table à la fois, il n'y a pas beaucoup d'avantages à avoir une seule table car vous essayez alors de faire une chose de deux choses. Si le nombre de colonnes "communes" entre les Tableaux 1 et 2 dépasse 2, diviser les tables et conserver les connaissances "spécifiques au domaine" dans les tables enfant est une excellente solution (voir les modèles de données "Parti") pour quelques exemples du monde CRM où c'est le cas).

La plupart des bases de données vont compresser des colonnes vides, il n'y a donc plus aucune raison physique de choisir l'une plutôt que l'autre.