2010-07-05 6 views
11

Si j'ai une classe appelée animal, chien et poisson est la sous-classe. L'animal a un attribut appelé "couleur". Le chien a l'attribut appelé "longueur de queue", et les poissons n'ont pas cet attribut. Les poissons ont l'attribut appelé "poids", les chiens n'ont pas cet attribut. Donc, je veux concevoir une base de données pour stocker cette information. Que devrais-je faire? Voici quelques idées:Comment implémenter une super classe, sous-classe relation dans la base de données?

Idée 1: Faire une table animale, et la table de type, pour trouver quel type d'animal, si c'est un chien, juste obtenir le résultat de la table de chien.

animaux: couleur: type String : int

Type: Chien: 0 Poissons: 1

Dog: TailLength: int

Poisson: Poids: int

Idée 2: Ne stockez que les tables Dog et Fish dans la base de données, retirez l'animal capable.

Chien: Couleur: String TailLength: int

Poisson: Couleur: String Poids: int

Répondre

12

Les deux approches que vous mentionnées:

  • Une table représentant des objets dans la hiérarchie d'héritage entière, avec toutes les colonnes dont vous avez besoin pour toute la hiérarchie plus une colonne "type" pour vous indiquer la sous-classe d'un objet particulier.
  • Une table pour chaque béton classe dans votre hiérarchie d'héritage, avec un schéma dupliqué.

peut être complété par deux autres:

  • Une table pour chaque classe dans votre hiérarchie d'héritage - vous avez maintenant une table animale, et les sous-classes ont des tables avec des clés étrangères qui pointent vers la commune ensemble de données dans Animal.
  • Schéma générique - possède une table pour stocker les objets et une table d'attributs pour prendre en charge tout ensemble d'attributs liés à cet objet.

Chaque approche a des avantages et des inconvénients. Il y a un bon aperçu d'entre eux ici:

Jetez aussi un coup d'œil à ces sujets SO:

Enfin, il convient de noter qu'il existe des bases de données orientées objet là-bas qui représentent des objets plus naturellement dans la base de données, et pourrait facilement résoudre ce problème, mais ils ne sont pas presque aussi fréquemment utilisé dans l'industrie. Voici quelques liens qui décrivent ces blocs de données par rapport aux blocs de données relationnelle, mais ils ne vous donnera pas un tout objectif (heh) avis sur la question:

+0

Le 1er lien d'oo à la fin est supprimé. – philipxy

0

Vous pouvez l'essayer comme ceci:

Animal 
    PK animal_id 
    FK animal_type 
    STRING animal_name (eg. 'Lassie') 

AnimalTypes 
    PK animal_type 
    STRING animal_type_name (eg. 'Dog') 

AnimalAttributes 
    PK attribute_id 
    STRING attribute_name (eg. 'tail length') 

AnimalToAttributes 
    PK id 
    FK animal_id 
    FK attribute_id 
    INTEGER value (eg. 20) 

De cette façon, vous pouvez avoir un ou plusieurs attributs par animal (à vous de choisir).

0

Utilisez un à zéro ou une relation Comme vous le soulignez, les tables sont appelées classe Dans la conception schéma base de données langue - sous-classe ou superclasse

Create Table Animal 
    (animalId Integer Primary Key Not null, 
    Other columns generic to all animals) 

    Create Table Birds 
    (BirdId Integer Primary Key Not Null 
    references Animal(AnimalId), 
    -- other columns) 
Questions connexes