Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL :Normalisation de la base de données tout en conservant les contraintes

Vous implémentez le Entity-Attribute-Value anti-modèle. Il ne peut s'agir d'une conception de base de données normalisée, car elle n'est pas relationnelle.

Ce que je suggérerais à la place est le Class Table Inheritance.html">Class Table Inheritance modèle de conception :

  • Créez un tableau pour les organismes, contenant les propriétés communes à toutes les espèces.
  • Créez un tableau par espèce, contenant les propriétés spécifiques à cette espèce. Chacune de ces tables a une relation 1 à 1 avec les organismes, mais chaque propriété appartient à sa propre colonne.

     ____________________             ____________________
    |     Organisms      |           |       Species      |
    |--------------------|           |--------------------|
    |OrganismId (int, PK)|           |SpeciesId (int, PK) |
    |SpeciesId (int, FK) |∞---------1|Name (varchar)      |
    |Name (varchar)      |           |____________________|
    |____________________|
              1
              |
              |
              1
     ______________________ 
    |    HumanOrganism     |
    |----------------------|
    |OrganismId (int, FK)  |
    |Sex      (enum)       |
    |Race     (int, FK)    |
    |EyeColor (int, FK)    |
    |....                  |
    |______________________|
    

Cela signifie que vous allez créer de nombreuses tables, mais considérez cela comme un compromis avec les nombreux avantages pratiques du stockage des propriétés d'une manière relationnellement correcte :

  • Vous pouvez utiliser les types de données SQL de manière appropriée, au lieu de tout traiter comme un varchar de forme libre.
  • Vous pouvez utiliser des contraintes ou des tables de recherche pour restreindre certaines propriétés par un ensemble prédéfini de valeurs.
  • Vous pouvez rendre les propriétés obligatoires (c'est-à-dire NOT NULL) ou utiliser d'autres contraintes.
  • Les données et les index sont stockés plus efficacement.
  • Les requêtes sont plus faciles à écrire pour vous et plus faciles à exécuter pour le SGBDR.

Pour en savoir plus sur cette conception, consultez le livre de Martin Fowler Patterns of Enterprise Application Architecture , ou ma présentation Modèles pratiques orientés objet en SQL , ou mon livre, Antipatterns SQL :éviter les pièges de la programmation de bases de données .