2010-07-05 14 views
11

Si tengo una clase llamada animal, el perro y el pez es la subclase. El animal tiene un atributo llamado "color". El perro tiene el atributo llamado "longitud de la cola", y los peces no tienen este atributo. Los peces tienen el atributo llamado "peso", el perro no tiene este atributo.¿Cómo implementar una relación de super clase y subclase en la base de datos?

Por lo tanto, deseo diseñar una base de datos para almacenar esta información. ¿Que debería hacer? Aquí hay algunas ideas:

Idea 1: Haciendo una tabla de animales, y la tabla tiene el tipo, para encontrar qué tipo de animal, si es un perro, simplemente obtenga el resultado de la tabla del perro.

Animal: de color: String Tipo: int

Tipo: perro: 0 pescado: 1

perro: longituddecola: int

pescado: Peso: int

Idea 2: Almacenar solo la mesa de perro y la mesa de pescado en la base de datos, quitar el animal t poder.

perro: Color: Cadena longituddecola: int

pescado: Color: Cadena Peso: int

Respuesta

12

Los dos enfoques se mencionan:

  • Una tabla que representa objetos en toda la jerarquía de herencia, con todas las columnas que necesitaría para toda la jerarquía más una columna "tipo" para indicarle qué subclase es un objeto en particular.
  • Una tabla para cada clase concreto en su jerarquía de herencia, con esquema duplicado.

se puede complementar con otros dos:

  • Una tabla para cada clase en su jerarquía de herencia - ahora tiene una mesa animal, y subclases tienen tablas con claves externas que apuntan a la común conjunto de datos en Animal.
  • Esquema genérico: tiene una tabla para almacenar objetos y una tabla de atributos para admitir cualquier conjunto de atributos asociados a ese objeto.

Cada enfoque tiene pros y contras. Hay un buen resumen de ellos aquí:

también echar un vistazo a estos temas SO:

Por último, hay que señalar que hay bases de datos orientadas a objetos por ahí que representan objetos de forma más natural en la base de datos, y fácilmente podría resolver este problema, a pesar de que no son tan frecuentemente utilizado en la industria. Estos son algunos enlaces que describen tales DBs en comparación con DB relacional, a pesar de que no le dará un punto de vista totalmente objetivo (je) en el asunto:

+0

El primer enlace oo al final se elimina. – philipxy

0

Usted podría tratar de esta manera:

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) 

esta manera se puede tener uno o muchos atributos por animal (depende de usted elegir).

0

utilizar una clase uno a cero o uno relación Como usted señala, en la base de datos lenguaje de diseño de esquema de las tablas se llaman - subclase o superclase

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) 
Cuestiones relacionadas