Comment intégrer un héritage ?

Du papier à la représentation

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut,

Voilà je me demandais comment on faisait pour intégrer la notion d'héritage dans mySQL, enfin, comment représenter l'héritage entre les tables. Par exemple :

Imaginons un table Vehicule(id, marque, année, km, .... ) et je souhaite faire une table Camion avec des champs supplémentaire. De manière logique, c'est un héritage. Mais de manière pratique, je fais comment ? Je crée une clé étrangère entre Vehicule.id et un Camion.vehiculeid ou je dis que Camion.id est identique à Vehicule.id ?

Merci de votre aide :p

+0 -0
Staff

Tout dépend la logique que tu utilises. Il semblerait que dans ton cas, on parle d'une logique ORM. A ce moment là, le mieux c'est d'essayer.

Visual studio étant ouvert, je vais jouer avec EntityFramework, mais on aurait pu utiliser tout autre ORM pour tout autre langage.

Prenons deux objets : Vehicule et Camion et demandons à l'ORM de générer la base de données associées

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public class Vehicule
    {
        public int ID{ get; set; }
        public string Brand { get; set; }
    }

    public class Truck: Vehicule
    {
        public float ReservoirCapacity { get; set; }
    }

les deux classes

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class DBContext : DbContext
    {
        // Votre contexte a été configuré pour utiliser une chaîne de connexion « DBContext » du fichier 
        // de configuration de votre application (App.config ou Web.config). Par défaut, cette chaîne de connexion cible 
        // la base de données « tests_forum_zds.DBContext » sur votre instance LocalDb. 
        // 
        // Pour cibler une autre base de données et/ou un autre fournisseur de base de données, modifiez 
        // la chaîne de connexion « DBContext » dans le fichier de configuration de l'application.
        public DBContext()
            : base("name=DBContext.cs")
        {
        }

        public DbSet<Vehicule> Vehicules { get; set; }
        public DbSet<Truck> Trucks { get; set; }

    }

le contexte de base de données

Activons les migrations et regardons le code qui génèrera la bdd :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public override void Up()
        {
            CreateTable(
                "dbo.Vehicules",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        Brand = c.String(),
                        ReservoirCapacity = c.Single(),
                        Discriminator = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => t.ID);

        }

La migration

Il semblerait que dans ce cas là, il a choisi de faire une table avec le nombre maximum d'attributs mais y a ajouté un "Descriminator".

Édité par artragis

+0 -0
Staff

Il n'y a qu'une seule table de créée qui rassemble les données des deux jeux d'entités. Le "Discriminator" n'est qu'une simple chaîne de caractère qui contient "Vehicule" ou "Truck" pour permettre de retrouver les camions et les non camions.

Il n'y a pas plus de code que ce que j'ai donné.

+0 -0

Salut,

Ce sera identique sous Doctrine bien qu'il propose les 2 solutions. En règle général on préférera n'avoir qu'une seule table contenant tous les véhicules quelque soit leur type (camion, vélo, moto, voiture, etc) et le discrimant permet à l'ORM de retrouver ses petits quand il doit reconstituer les objets et/ou mapper les collections. Les champs présent pour camion seront NULL pour les autres et inversement.

Édité par Zazou

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte