none
héritage des tables RRS feed

  • Question

  • bonjour à tous, voila je débute avec SQL serveur 2008 et je doit créer une base de données ou y a un héritage: les tables père et mère héritent de la table personne. j'ai bien créé les trois tables avec tous leurs attributs mais je sais pas comment faire pour que le système comprenne que les tables père et mère hérite de tous les attributs (mm la clé) de la table personne.

    merci de votre aide

    mardi 6 septembre 2011 07:44

Réponses

  • Voici un petit exemple :

    CREATE TABLE dbo.Personne(PersonneId int identity(1, 1), Row1 int, Row2 int
    CONSTRAINT PK_Personne PRIMARY KEY (PersonneId))
    
    
    
    CREATE TABLE dbo.Pere(PersonneId int, Row3 int, Row4 int
    CONSTRAINT PK_Pere PRIMARY KEY (PersonneId),
    CONSTRAINT FK_Pere_Personne FOREIGN KEY (PersonneId) REFERENCES Personne(PersonneId))
    

     

    Ensuite tu as le  choix d'implémenter les cascades, mais je ne suis pas fan de cette solution. Mieux vaut contrôler le comportement au niveau applicatif.

    mardi 6 septembre 2011 09:23

Toutes les réponses

  • Bonjour Lilyabad,

    concernant l'héritage, il s'agit, comment dire, d'un concept

    Voici quelques méthodes :

    • Une colonne supplémentaire Père et une Mère dans la table Personne qui référencent la PK de la table Personne et qui sont des FK.

     

    • L'utilisation du type hierarchyid qui permet d'implémenter une hierarchie.

    http://msdn.microsoft.com/fr-fr/library/bb677290.aspx

    • Comme je ne suis pas sur de ce que tu veux, également la spécialisation.

    La table Personne possède une clé primaire et tous les attributs communs àux entités de tes tables spécialisées. (Ex: nom, prénom, date de naissance, ....)

    Tes tables Pere et Mere héritent ensuite de la clé primaire de la table personne qui devient également clé primaire de ces tables ainsi que clé étrangère.

    Ces tables portent les attributs spécifiques du père (couleur de cravate préférée,....) ou de la mère (couleur de tailleur préférée, ...) .

     Cordialement.

     

     

    mardi 6 septembre 2011 08:05
  • Merci pr ta réponse casimor, je sais bien que l'héritage est un concept, ce que je veux c'est comment l'implémenté sur sql 2008, cad comment dire que  la clé primaire de la table père est celle de la table personne en sql. le coté conception est déjà effectué (je sais que la clé primaire de la table personne doit être la clé primaire de la table père mais je ne sais pas comment le faire) il me reste juste à créer ces tables dans le serveur de base de données. Je débute en sql serveur je ne sais que créer des tables mais je ne sais pas faire le lien entre les différentes tables.
    mardi 6 septembre 2011 08:28
  • Voici un petit exemple :

    CREATE TABLE dbo.Personne(PersonneId int identity(1, 1), Row1 int, Row2 int
    CONSTRAINT PK_Personne PRIMARY KEY (PersonneId))
    
    
    
    CREATE TABLE dbo.Pere(PersonneId int, Row3 int, Row4 int
    CONSTRAINT PK_Pere PRIMARY KEY (PersonneId),
    CONSTRAINT FK_Pere_Personne FOREIGN KEY (PersonneId) REFERENCES Personne(PersonneId))
    

     

    Ensuite tu as le  choix d'implémenter les cascades, mais je ne suis pas fan de cette solution. Mieux vaut contrôler le comportement au niveau applicatif.

    mardi 6 septembre 2011 09:23
  • Bonjour

    Je pense juste qu'il y confusion entre introduire une relation parent enfant et la notion d'héritage.

    Pour ce qui est de la relation parent / enfant, la solution de casimor est la bonne.

    Pour ce qui de la notion d'héritage, il y a plusieurs solutions envisageable.
    Vous aurez une table "Personne", cette table contiendra les attributs communs à tous sous forme de colonnes.

    CREATE TABLE dbo.Personne
    (
    	Id int IDENTITY(1,1) PRIMARY KEY,
    	Nom varchar(200) NOT NULL
    )
    


    Et ensuite vous aurez une table par classe héritant de cette classe (table) personne :

    CREATE TABLE dbo.Mere
    (
    	Id int PRIMARY KEY,
    	Col1 varchar(50) NOT NULL,
    	Col2 int
    )
    
    CREATE TABLE dbo.Pere
    (
    	Id int PRIMARY KEY,
    	Col3 float NOT NULL,
    	Col4 varchar(10)
    )
    

    Notez que je n'ai pas remis l'attribut IDENTITY sur les colonnes ID, ce n'est pas un autoincrément sur les tables filles, on reprend l'identifiant de la table mère (personne).

    Ensuite on définie la relation entre les tables, qui est de type 1:0.

    ALTER TABLE dbo.Mere ADD CONSTRAINT FK_Mere FOREIGN KEY (ID) REFERENCES dbo.Personne(ID)
    
    ALTER TABLE dbo.Pere ADD CONSTRAINT FK_Pere FOREIGN KEY (ID) REFERENCES dbo.Personne(ID)
    

    Il existe d'autres méthode de modélisation qui ne s'appuirait que sur une table (dbo.Personne), dans ce cas on aurait recours à une colonne XML qui contriendrait tous les attributs. Une autre solution serait de définir la table comme SPARSE (depuis SQL Server 2008) et d'ajouter les attributs sous forme de colonnes nullable (jusqu'à 32000).

    Bonne journée...


    Christian Robert - MVP SQL Server - Microsoft Certified Master - SQL Server 2008
    Blog : http://www.sqlnco.ch
    Groupe des Utilisateurs Francophone de SQL Server : http://www.guss.fr
    mardi 6 septembre 2011 09:52
    Modérateur
  • j'aurais du effectivement être plus clair :)

    Il est également possible d'utiliser le hierarchyId.

     

     

    mardi 6 septembre 2011 10:55
  • Ah oui, j'avais mal lu les réponses, on parlait bien des mêmes choses.

    Bon je vais aller me coucher moi.


    Christian Robert - MVP SQL Server - Microsoft Certified Master - SQL Server 2008
    Blog : http://www.sqlnco.ch
    Groupe des Utilisateurs Francophone de SQL Server : http://www.guss.fr
    mardi 6 septembre 2011 14:03
    Modérateur