10
votes

Bon DB Table Design: une table mélangeant différentes entités ou table séparée pour chaque entité

Qu'est-ce que la meilleure conception de la base de données?

Avoir une grande table pouvant contenir différents "types" d'enregistrements, par exemple: des employés, des voitures, des téléphones cellulaires et afin d'identifier chaque type d'enregistrement, nous avons une colonne appelée type.

Donc, la table aurait des colonnes qui ressemblent à

ID | Type | Nom

1 | voiture | Ford

2 | voiture | Toyota

3 | Téléphone | Motorola

4 | employé | Jack

5 | employé | ANEESH

6 | Téléphone | Nokia

7 | Téléphone | Motorola

ou avoir des tables différentes pour chaque type

EG:

Employés

id | Nom

Voitures

id | Nom

Téléphones

id | Nom

Ces tables pourraient avoir des références de clé étrangère à partir d'autres tables. Maintenant, si chaque table avait des colonnes différentes, la décision aurait été simple que vous ne pouvez pas avoir cela dans la même table. Ainsi, l'option 1 est probablement exclue (sauf si toutes les colonnes qui ne sont pas communes sont nullables). Mais que si ces différentes entités avaient des colonnes similaires, dans ce cas, quelle est la meilleure conception?

Qu'est-ce qui pourrait être les arguments pour et contre chacun?


3 commentaires

Quelle base de données relationnelle utilisez-vous?


Oracle. Est-ce que ça importe cependant?


Un type d'énumage pourrait être pris en compte, mais toutes les bases de données relationnelles ne prennent de manière native le type.


4 Réponses :


5
votes

Comme ils sont des types vraiment différents, je suggérerais de stocker des tables séparées dans des tables séparées. Cela empêche d'avoir à maintenir une liste de types, car ils sont tous dans leurs propres tables. De plus, si, à l'avenir, l'un de ces types est prolongé (par exemple, vous allez stocker des numéros de téléphone pour les employés), vous n'obtenez aucune relation étrange comme des numéros de téléphone pour les voitures. Il rend également votre base de données plus facile à comprendre et à entretenir.


0 commentaires

4
votes

Roald van Doorn est absolument juste. Si vous avez une seule table et que vous l'étendez de quelque manière que ce soit, vous enfreignez deuxième forme normale . Comme William Kent a dit: "La deuxième forme normale est violée lorsqu'un champ non clé est un fait sur un sous-ensemble d'une clé." L'exemple de «numéros de téléphone des employés» de Roald Van Doorn illustre la violation.

William Kent's Un guide simple sur cinq formes normales dans la théorie de la base de données relationnelle est une Super papier à examiner lorsque vous vous demandez une question de conception de la base de données.


0 commentaires

9
votes

Je suis d'accord avec tout le monde - utilisez définitivement des tables séparées. Vous ne perdez rien en ayant des tables séparées - simplement parce que vous avez quelques tables supplémentaires, votre base de données ne sera pas plus lente ou moins gérable.

Mais vous gagnez beaucoup - vous n'avez pas besoin d'avoir beaucoup de champs qui n'ont aucun sens pour un type d'entité, etc. Vous adhérez à 2NF autant d'avoir signalé, et c'est certainement une bonne chose!

Consultez cet article intéressant sur une conversation simple appelée

cinq erreurs de conception de base de données simples et comment les éviter

erreur n ° 1 est ce que l'auteur appelle la "Table de recherche commune", ce qui semble beaucoup comme ce que vous essayez de faire - mais pour de vraies données en direct.

Lisez l'article, intériorisez toutes ses exigences - excellentes choses et très recommandées!


0 commentaires

2
votes

Je dirai que toutes les réponses ci-dessus sont 1. CORRECT Compte tenu de l'exemple cité dans la question et 2. CORRECT pour presque tous le temps.

Chaque maintenant, je rencontre une situation où un seul la table est meilleure. Il est si peu fréquent que, quand il s'agit, je me demande si j'ai besoin d'architecte autour d'une entité monolithique (neutre) ou non. Je rejette rapidement l'envie - peut-être demander à quelqu'un d'autre, et je ne parviens pas à énoncer mes cas de manière adéquate et que nous retombons de la façon dont nous le faisons toujours. P>

Alors, comme il s'avère que tard dans le jeu, je trouve que j'aurais dû faire une table unique d'un type d'entité neutre. P>

Voici un exemple qui fait mon cas: p>

Supposons deux types d'entité, une société et une personne. Un Corp appartient généralement à une personne, mais parfois une autre société possède une société. P>

Tenir cette pensée et y ajouter, disons que chaque société a un agent enregistré responsable de la création légale. de la société. Et, en favorisant mon illustration, l'agent enregistré peut être une personne ou une autre société. P>

Étant donné que le propriétaire / parent à la société / enfant peut être une personne ou une amcorporation, vous pouvez commencer à voir le défi. En revanche, si seulement les personnes pouvaient posséder des sociétés, votre table de liens de propriété est très conventionnelle avec les colonnes: la propriété (en quelque sorte inutile), corporationded, personnage. P>

Au lieu de cela, vous avez besoin de quelque chose comme: Propriété, PROPRIÉTAIDED , Propriétaire Et d'une manière ou d'une autre, vous pouvez faire ce travail, mais ce ne sera pas amusant, de dire le moins. P>

Continuer avec l'exemple que j'ai donné, vous devez attribuer un agent à chaque société. Habituellement, l'agent est l'un des propriétaires (une personne). Dans ce cas, vous voulez vraiment vous relier à celui de cette personne. Vous ne voulez pas avoir enregistrement de la personne en tant que propriétaire, puis à nouveau en tant qu'agent (dans une table d'agent). Ce serait redondant. De mauvaises choses vont arriver. : -) p>

De même à ce "problème", un agent enregistré peut également être une société, telle qu'un cabinet d'avocats, une CPA ou une société de dépôt de BIG, appelant certains exemples typiques. Tout comme l'agent-personne, un agent-corporation ne devrait vraiment pas obtenir son propre dossier. Il faut relier à l'enregistrement déjà existant de son existence d'entreprise dans la table de la société. [Sauf que je dis que je dis que je dis en fin de compte pas em> avoir une table de société] p>

Tout comme la table de liaison correspondant à chaque société à son propriétaire de tout type, personne ou Corporation, vous pourriez-vous EM> avoir un agent de lien d'agent de: AgentRePresentationID, CorporationD, AgentID, Agenttype ... Mais à nouveau, ce serait laid (OMI) lorsque vous devez regrouper les agents associés - certains De la table de la personne, certaines de la table de la société. P>

Ainsi, dans ce cas, vous pouvez voir comment un type d'entité neutre peut être avantageux. Ce serait quelque chose comme ceci: P>

Table: Entitytall Colonnes de clé: Entitéïde, EntityType (ou entitéypeid Si vous insistez, liez-vous pour obtenir la description), EntityName (il y a des préoccupations avec des noms et des types différents ... hors sujet à ce poste) P>

Link Table: Personne de la corporation Colonnes de clé: La propriété (encore une fois, mon commentaire que c'est un peu inutile), Childentitéticulaire (l'entité appartenant à l'enfant; nommé "enfant" pour la clarté, je ne le nommerais pas que) Parententitéticulaire (l'entité parent) p>

Link Tableau: AgentRepresentation Colonnes de clé: Agentpresentationid (... je ne le dirai pas), CorporationtentikyID (l'entité CORP étant représentée), AGENTENTITYIDID (de la table d'entité, assimilé à l'enregistrement qui est l'agent ici) p>

Bien que vous puissiez être correct avec mon architecture, vous devez être un peu dérangé par la nommée de la colonne dans les tables de liaison. Ça me dérange. Généralement, les deuxième et troisième noms de colonne de ces tableaux correspondent exactement au nom des colonnes que vous rejoindre code> dans la table respective de chaque entité (haha, mais chaque entité ne a em> un em> respectif Tableau de sorte que vous ne pouvez pas avoir les noms de colonne de table de liaison correspondent aux noms de colonne source car ils sont la même colonne). Techniquement, cela n'a pas d'importance, mais cela brisera vos conventions de nommage qui devrait importer, mais pas suffisamment pour ne pas le faire. P>

au cas où je ne l'aurais pas poussé à la maison assez bien, voici comment tu es à quoi ll tire-le ensemble. Vous rejoindre code> l'entitéTall TABLE sur elle-même pour obtenir ce dont vous avez besoin. P>

Liste de tous les corps et de leurs propriétaires (en T-SQL): P>

SELECT Corp.EntityName as CorpName, Owner.EntityName as OwnerName
FROM EntityAll as Corp
JOIN CorporationOwnership as Link on (Corp.EntityID = Link.ChildEntityID)
JOIN EntityAll as Owner on (Link.ParentEntityID = Owner.EntityID)


1 commentaires

Je devrais admettre que l'exemple que j'ai choisi est celui que j'ai déjà mis en œuvre en utilisant des tables pour chaque type d'entité (même une table d'agent). Mes besoins vont au-delà de la logique de jointure de base. Très vite, je dois être capable de rouler des entités à travers les types d'entité (comme la société John Smith CPA, P.A. et son propriétaire, John Smith peut se déplacer vers une unité logique à diverses fins). Les rouleaux peuvent même apporter des enregistrements en dehors de leur liaison déjà définie par la ou les tableaux de liaison.