Lors de la normalisation d'une base de données relationnelle, plusieurs tables de "type" doivent-elles être combinées en une seule?


4

Avant d’apporter des modifications importantes au contenu, aux fonctionnalités et à la conception de mon site Web (je vais tout refondre, une réécriture presque complète), je suis en train de configurer une nouvelle base de données PostgreSQL pour stocker toutes les données précédemment dans une base de données MySQL.J'ai également un blog WordPress fortement personnalisé que je vais passer à ce site Web, fusionnant efficacement les deux sites.Outre le contenu de façade du site Web, il y a beaucoup d'autres informations que je stocke dans la base de données pour mon propre usage, telles que des informations sur le client, l'historique des ventes, les factures, les revenus d'événements, etc. Nous avons passé beaucoup de temps à réfléchir soigneusement et à essayer de repenser correctement la base de données en veillant à l'intégrité et à la performance des données.

Le site Web présentera de nombreux types de "contenus": pages, événements/concerts, échantillons multimédia, partitions/diagrammes (dont certains seront disponibles à la vente au format PDF sur le site), articles de blog, etc.

L'un des changements que j'ai apportés concerne la manière dont je stocke les lieux et les lieux.J'avais l'habitude d'avoir une table "sites" qui faisait référence à une table "type de site" ainsi qu'à une table "villes", qui faisait référence à une table "états/provinces", qui faisait référence à une table "pays".La plupart de ces informations étaient utilisées par les "événements", mais j'ai ensuite ajouté les informations sur le client, qui devaient référencer la table des villes.De plus, tous les articles de mon blog sont géolocalisés, ils devront donc également faire référence à ces lieux.Comme toutes les tables avaient un schéma très similaire, j'ai créé une nouvelle table "places" avec des colonnes "id" et "parent_id" afin que les places puissent être stockées de manière hiérarchique.J'ai aussi une table "places_type" afin de pouvoir imposer que le parent_id de chaque ligne doit être d'un type hiérarchique supérieur à l'endroit lui-même.(Par exemple, une ville peut avoir un État ou un pays comme type de parent, mais une ville ne peut pas avoir un restaurant comme type de parent.)

En faisant cela, j'ai créé beaucoup d'autres tables avec exactement le même schéma (id, parent_id, name) pour contenir les "types" d'autres contenus dans une hiérarchie.Genres, méthodes de paiement, types de graphique, types d'événement, types de support, types de facture, etc.

Puisque toutes les tables ont exactement le même schéma, serait-il préférable de combiner toutes ces tables dans une seule table "types" et d'ajouter un champ "catégorie" à la table?

Je pense qu'il serait beaucoup plus facile de gérer un seul tableau "types" que onze tableaux similaires.J'ai calculé que cette table "types" ne contiendrait que 60 lignes environ, pour le moment.

Je me demande quelle serait la meilleure pratique pour ce genre de chose en termes de conception de base de données?Les données seront récupérées beaucoup plus fréquemment que mises à jour/ajoutées.

Dans le même temps, comme cette table "types" contiendrait tous les types, elle devra être jointe (via une vue) plusieurs fois à plusieurs tables.Par exemple, pour récupérer les informations sur les événements, je joins déjà une table "events" aux tables "places", "artists" et "media", mais je devrais également joindre ces tables à la table "types" pour obtenir les types d'événement. types de lieux, types d'artistes et types de médias.Alors serait-il préférable de séparer les tables de types ou de les combiner en une seule?Pourquoi?

  0

C'est l'une de ces choses "pas de réponse simple et simple". Cela dépend assez de vos besoins. De votre description, il semble que l'approche "types" soit probablement plus propre que beaucoup de tables avec un schéma similaire, et une jointure avec une petite table est généralement très bon marché si vous faites déjà d'autres jointures. OTOH, parfois les exigences de performance conduisent à la dénormalisation nécessaire. Je commencerais par votre approche des types et ajusterais si vous avez des problèmes sur la piste. 30 mai. 142014-05-30 01:37:56

  0

@DM, ressemble à un modèle OTLT (One true lookup table), mais doit être basé sur vos besoins. De plus, les principaux inconvénients sont l'impossibilité d'avoir des relations de clés étrangères et d'avoir plus d'accès à la même table menant à une contention. Pour plus lire, https://www.red-gate.com/simple-talk/sql/t-sql-programming/look-up-tables-in-sql/ 10 oct.. 172017-10-10 05:51:53

3

Je choisirais des tables séparées pour chaque type.Avec si peu de lignes, les performances ne seront pas prises en compte.Les tableaux individuels auront seulement une page ou deux chacun.De même pour la table combinée.

De toute façon, vous devrez rejoindre une table "type" pour compléter vos vues.Les insertions sont peu fréquentes à ce niveau d'abstraction, il est donc peu probable que le verrouillage soit un problème dans les deux cas.

Pour moi, cependant, le fait d'avoir différentes tables permet de séparer les éléments logiquement distincts, ce qui est un design plus propre.

Il y aura beaucoup de tables différentes qui auront une relation avec une table de types.S'il existe de nombreuses tables de types, les relations de clé étrangère sont auto-documentées et exécutables via DRI.Avec une table combinée, il est difficile d’utiliser DRI pour dire "Venue.TypeID provient de Type.TypeID mais uniquement si Type.Category = 'V'", par exemple.Le côté complémentaire de cette relation - "Type.TypeID avec Type.Category =" V "ne peut être utilisé que dans la table Venue" - n'est également pas pris en charge dans les DRI des SGBDR que je connaisse.

  0

Je prévoyais d'utiliser une fonction personnalisée dans un Vérifiez la contrainte pour vous assurer que seuls des "types" valides peuvent être utilisés dans chacune des sous-tables. Pas de DRI, mais au moins l'intégrité des données serait toujours préservée. Je commence à penser que le fait d'avoir plusieurs tables séparées peut être une approche plus saine et plus propre ... 31 mai. 142014-05-31 11:59:08

  0

Les fonctions scalaires peuvent être extrêmement lentes. Testez ceci à l'échelle prévue avant de vous engager dans cette approche. 01 juin. 142014-06-01 10:25:04


0

La mise en page de votre base de données dépend de la granularité des informations que vous souhaitez stocker. Je vous suggère d'utiliser un progiciel de schéma d'entité pour mettre en forme votre nouvelle base de données en théorie avant de la remplir avec des données en direct, puis de réaliser que vous avez «perdu» et oublié une colonne ou un tableau. À un moment ou à un autre, si vous voulez un renseignement que vous n'avez pas, planifiez-le maintenant, même s'il est vide à ce moment précis. D'autre part, l'effondrement des tables est faisable si vous êtes prêt à échanger la granularité que vous perdez pour l'augmentation de l'optimisation que vous gagnez.