Modelando Base de Datos con Rational Rose

Ing. Yamil Ramos García

Agenda
• Los tres Modelos del Modelador de
Datos de Rational Rose. • Construir un Modelo de Datos a partir de un Modelo de Análisis. • Construir un Modelo de Almacenamiento. • Generar una base de datos a partir de un Modelo de Datos.

UPC - Análisis y Diseño Orientado a Objetos

2

17/04/08

Conociendo el Modelador de Datos
• Para modelar los datos de un Sistema con la
herramienta Rational Rose se utiliza Data Modeler (Modelador de datos)

• • • •

Es una herramienta adicional (add-in). Permite construir el Modelo de Datos. Permite construir el Modelo de Almacenamiento. Utiliza UML como estándar de modelado.
UPC - Análisis y Diseño Orientado a Objetos 3 17/04/08

Modelos del Modelador de Datos
• El Modelador de Datos se basa en tres Modelos.
Modelo de Análisis.  Modelo de Datos.  Modelo de Almacenamiento.

Modelo de Análisis

Modelo de Datos

Modelo de Almacenamiento

UPC - Análisis y Diseño Orientado a Objetos

4

17/04/08

Modelo de Análisis

• Representa la vista lógica de las clases. • Presenta los conceptos o clases fundamentales y la
relación entre ellos. • Es independiente del tipo de Base de Datos. • Está compuesto por:
Clases.  Atributos.  Operaciones.  Asociaciones.  Diagrama de clases.

UPC - Análisis y Diseño Orientado a Objetos 5 17/04/08

Modelo de Análisis

Modelo de Análisis
escribe 1..n Autor codAutor : Long nombre : String apellidos : St ring sexo : Boolean fec haNacimiento : Date 1..n Libro codLibro : Long titulo : String fechaEdicion : Date

Modelo de Análisis

Aut or-Libro principal : Boolean tema : String

UPC - Análisis y Diseño Orientado a Objetos

6

17/04/08

Modelo de Datos
• Representación de la vista física de
los datos. • Es dependiente del tipo de Base de Datos. • Está compuesto por:
Tablas.  Columnas o campos.  Llaves primarias y foráneas.  Restricciones.  Índices.  Relaciones.  Diagrama del Modelo de Datos.

UPC - Análisis y Diseño Orientado a Objetos

Modelo de Datos

7

17/04/08

Modelo de Datos
TAutor codAutor : INTEGER nombre : VARCHAR(255) apellidos : VARCHAR(255) sexo : SMALLINT fechaNacimiento : DATE TAutor_ID : INTEGER TPais_ID : INTEGER <<PK>> PK_TAutor0() <<FK>> FK_TAutor5() <<Index>> TC_TAutor8() TLibro codLibro : INTEGER titulo : VARCHAR(255) fechaEdicion : DATE TLibro_ID : INTEGER <<PK>> PK_TLibro1() 1 <<Identifying>> 1 <<Identifying>> 0..* TAutor-Libro principal : SMALLINT tema : VARCHAR(255) TLibro_ID : INTEGER TAutor_ID : INTEGER <<PK>> PK_TAutor-Libro2() <<FK>> FK_TAutor-Libro0() <<FK>> FK_TAutor-Libro1() <<Index>> TC_TAutor-Libro0() <<Index>> TC_TAutor-Libro1() 0..*

Modelo de Datos

UPC - Análisis y Diseño Orientado a Objetos

8

17/04/08

Modelo de Almacenamiento
• Representación de la vista física de la

Modelo de Almacenamiento

Arquitectura de Almacenamiento de los datos. • Elementos de Almacenamiento de Base de Datos. • Es dependiente de la Base de Datos. • Está compuesto por:
Componente de Base de Datos.  Tablespace.  Script de la Base de Datos física.  Diagrama de Componentes.

UPC - Análisis y Diseño Orientado a Objetos 9 17/04/08

Modelo de Almacenamiento

Modelo de Almacenamiento

SIN DBA

<<Tablespace>> TSP_BIBLIOTECA

<<Tablespace>> TST_BIBLIOTECA

UPC - Análisis y Diseño Orientado a Objetos

10

17/04/08

Modelador de Datos (Data Modeler)
(Data Modeler)?

• ¿Qué puede hacerse con el Modelador de Datos
Construir el Modelo de Datos.
 Desde cero.  Transformando el Modelo de Análisis automáticamente.

Construir el Modelo de Almacenamiento.
 Transformar el Modelo de Datos en la Base de Datos física.  Transformar el Modelo de Datos en el Script de la Base de Datos física.

Aplicar ingeniería inversa:
 Transformar el Modelo de Datos en el Modelo de Análisis .  Transformar la Base de Datos del Modelo de Almacenamiento en el Modelo de Datos.
UPC - Análisis y Diseño Orientado a Objetos 11 17/04/08

Modelador de Datos
• El Modelador de Datos soporta los formatos de
base de datos siguientes:
Estándar ANSI SQL 92.  Base de Datos IBM DB2.  Base de Datos Oracle.  Base de Datos Microsoft SQL Server.  Base de Datos Sybase.

UPC - Análisis y Diseño Orientado a Objetos

12

17/04/08

Transformar el Modelo de Análisis en el Modelo de Datos
UPC - Análisis y Diseño Orientado a Objetos 13

17/04/08

Transformación Modelo Análisis - Modelo Datos

1. Definir las clases persistentes que serán las que participarán en la transformación. 2. Indicar los atributos que se sugieren como parte de la identidad del objetos (llaves primarias). 3. Agrupar las clases persistentes en un paquete. La transformación ocurre solo a nivel de paquete. 4. Crear un componente de Base de Datos en la Vista de Componentes. 5. Transformar el Modelo Análisis-Modelo Datos. 6. Construir el Diagrama del Modelo de Datos.
UPC - Análisis y Diseño Orientado a Objetos 14 17/04/08

Transformación Modelo Análisis - Modelo Datos
1. Definir las clases persistentes que van a participar en la transformación.
1. 2. 3. 4.

Seleccionar la clase. Hacer doble clic y se muestra el formulario de especificaciones de la clase. Seleccionar la pestaña Detail. Marcar la clase como persistente en el control correspondiente.

UPC - Análisis y Diseño Orientado a Objetos

15

17/04/08

Transformación Modelo Análisis - Modelo Datos

UPC - Análisis y Diseño Orientado a Objetos

16

17/04/08

Transformación Modelo Análisis - Modelo Datos
2. Indicar los atributos que se sugieren como parte de la identidad del objetos (llaves primarias). Seleccionar la clase.
1. 2. 3. 4.

Seleccionar la clase en el explorador del proyecto. Expandir la clase. Seleccionar el atributo. Hacer clic derecho y seleccionar Data Modeler/Part of Object Identity

UPC - Análisis y Diseño Orientado a Objetos

17

17/04/08

Transformación Modelo Análisis - Modelo Datos

UPC - Análisis y Diseño Orientado a Objetos

18

17/04/08

Transformación Modelo Análisis - Modelo Datos
3. Agrupar todas las clases persistentes en un paquete. La transformación ocurre solo a nivel de paquete.
1. 2.

Para ello se crea un paquete dentro de la Vista Lógica y se mueven hacia dentro las clases persistentes. Se sugiere realizar este paso desde el inicio de la construcción del Modelo de Análisis.

UPC - Análisis y Diseño Orientado a Objetos

19

17/04/08

Transformación Modelo Análisis - Modelo Datos
4. Crear un componente de Base de Datos en la Vista de Componentes.
1. 2.

Seleccionar la Vista de Componentes. Hacer clic derecho, seleccionar Data Modeler / New / Database. Como resultado se crea un paquete con el nombre DB_n y un componente de Base de Datos de igual nombre en su interior.

UPC - Análisis y Diseño Orientado a Objetos

20

17/04/08

Transformación Modelo Análisis - Modelo Datos

UPC - Análisis y Diseño Orientado a Objetos

21

17/04/08

Transformación Modelo Análisis - Modelo Datos
4. Crear un componente de Base de Datos en la Vista de Componentes.
1.

El componente creado representa la Base de Datos física sobre la cual se va a generar el esquema, por tanto el nuevo paquete y el nuevo componente de Base de Datos creados deben ser renombrados con el nombre que identifica a la Base de Datos.

UPC - Análisis y Diseño Orientado a Objetos

22

17/04/08

Transformación Modelo Análisis - Modelo Datos
4. Crear un componente de Base de Datos en la Vista de Componentes.
1.

Especificar el tipo de la Base de Datos haciendo doble clic sobre el componente de Base de Datos creado.

UPC - Análisis y Diseño Orientado a Objetos

23

17/04/08

Transformación Modelo Análisis - Modelo Datos
4. Crear un componente de Base de Datos en la Vista de Componentes.
1. 2.

Se debe crear un Tablespace en la Base de Datos y para ello se selecciona el componente. Hacer clic derecho sobre el componente y seleccionar Data Modeler/New/Tablespace

UPC - Análisis y Diseño Orientado a Objetos

24

17/04/08

Transformación Modelo Análisis - Modelo Datos
4. Crear un componente de Base de Datos en la Vista de Componentes.
1.

Hacer doble clic sobre el Tablespace creado para especificar todas sus propiedades. Esto depende del tipo de la Base de Datos.

UPC - Análisis y Diseño Orientado a Objetos

25

17/04/08

Transformación Modelo Análisis - Modelo Datos
4. Crear un componente de Base de Datos en la Vista de Componentes.
1.

Oracle

DB2

UPC - Análisis y Diseño Orientado a Objetos

26

17/04/08

Transformación Modelo Análisis - Modelo Datos
1. 2.

5. Transformar el Modelo Análisis -Modelo Datos.
Seleccionar el paquete que contiene al Modelo de Análisis. Hacer clic derecho y seleccionar Data Modeler / Transform to Data Model.

UPC - Análisis y Diseño Orientado a Objetos

27

17/04/08

Transformación Modelo Análisis - Modelo Datos
1.

5. Transformar el Modelo Análisis -Modelo Datos.
Especificar los parámetros de la transformación.
1. 2. 3. 4.
2.

Nombre del esquema (Modelo de Datos) destino. Componente de la base de datos. Prefijo para el nombre de las tablas. Si se desea o no índice para las llaves foráneas.

Hacer click en el botón Ok para comenzar la transformación.

UPC - Análisis y Diseño Orientado a Objetos

28

17/04/08

Transformación Modelo Análisis - Modelo Datos

UPC - Análisis y Diseño Orientado a Objetos

29

17/04/08

Mapa de Transformación
Modelo de Análisis Clase Atributo Modelo de Datos Tabla Columna Resultado Las clases persistentes son transformadas en tablas Los atributos de las clases se transforman en columnas usando el mismo nombre de los atributos. Los atributos son transformados en tipos de Datos propios de la Base de Datos

Operación Asociación

No transformada Relación Las asociaciones se transforman de acuerdo a su tipo.
30 17/04/08

UPC - Análisis y Diseño Orientado a Objetos

Transformación de los atributos
Modelo de Análisis Modelo de Datos
T_Clase X

Clase X
(from NewPackage)

atributoCadena : S tring atributoLogico : Boolean atributoNumerico : Long atributoReal : Double

atributoCadena : VARCHAR(255) atributoLogico : SMALLINT atributoNumerico : INTEGER atributoReal : DOUBLE PRECISION

<<PK>> PK_T_Clase X1()

UPC - Análisis y Diseño Orientado a Objetos

31

17/04/08

Mapa de transformación para Oracle
Tipos de Datos Modelo de Análisis STRING INTEGER DOUBLE DATE BOOLEAN BYTE SINGLE LONG CURRENCY Tipos de Datos Modelo de Datos VARCHAR2(255) NUMBER (10,0) FLOAT DATE NUMBER (5,0) NUMBER (3,0) FLOAT NUMBER (20,0) FLOAT
32 17/04/08

UPC - Análisis y Diseño Orientado a Objetos

Mapa de transformación para DB2
Tipos de Datos Modelo de Análisis STRING INTEGER DOUBLE DATE BOOLEAN BYTE SINGLE LONG CURRENCY Tipos de Datos Modelo de Datos VARGRAPHIC(255) INTEGER DOUBLE TIMESTAMP SMALLINT SMALLINT REAL BIGINT DOUBLE
33 17/04/08

UPC - Análisis y Diseño Orientado a Objetos

Mapa de transformación para SQL
Tipos de Datos Modelo de Análisis STRING INTEGER DOUBLE DATE BOOLEAN BYTE SINGLE LONG CURRENCY Tipos de Datos Modelo de Datos VARCHAR(255) INT FLOAT DATETIME BIT SMALLINT FLOAT INT MONEY
34 17/04/08

UPC - Análisis y Diseño Orientado a Objetos

¿Qué sucede con las llaves?
• Por cada atributo parte de la identidad del objeto el
Modelador de Datos crea una columna.

Se mantiene el nombre del atributo.

• Si no se especifica lo anterior el Modelador de
Datos crea una columna.
 

Nombre: NombreDeLaTabla + _ID Tipo de dato: ENTERO.

• En ambos casos se crea la restricción de llave
primaria PK.
UPC - Análisis y Diseño Orientado a Objetos 35 17/04/08

Atributo parte de la identidad del objeto
Modelo de Análisis Modelo de Datos
T_Clase K atributoIdentidad : VARCHAR(255) atributo : VARCHAR(255) <<PK>> PK_T_Clase K3()

Clase K
(from NewPackage)

atributoIdentidad : String atributo : String

UPC - Análisis y Diseño Orientado a Objetos

36

17/04/08

Atributo sin identificar

Modelo de Objetos

Modelo de Datos
T_Clase Z at ributo : SMALLINT T_Clase Z_ID : INTEGER <<PK>> PK_T_Clas e Z4()

Clase Z
(from NewPackage)

atributo

UPC - Análisis y Diseño Orientado a Objetos

37

17/04/08

¿Qué sucede con las relaciones?
tabla B . • Relación es IDENTIFICANTE.
 Si

• Cuando una tabla A tiene una relación con una
la llave de A es parte de la llave primaria de B.  La relación de A con B identifica o contribuye a identificar a un objeto de B.

• Relación es NO IDENTIFICANTE.
 Si

la llave de A no es parte de la llave primaria de B.  La relación de A con B no identifica o contribuye a identificar a un objeto de B.
UPC - Análisis y Diseño Orientado a Objetos 38 17/04/08

Relación IDENTIFICANTE
T_Clase A llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase A5() T_Clase B llave de B : NUMBER(5, 0) <<PK>> PK_T_Clase B6()

T_Clase A llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase A5()

<<Identifying>> 0..* 0..1

T_Clase B llave de B : NUMBER(5, 0) llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase B6() <<FK>> FK_T_Clase B2()

UPC - Análisis y Diseño Orientado a Objetos

39

17/04/08

Relación IDENTIFICANTE
T_Clase A llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase A5() T_Clase B llave de B : NUMBER(5, 0) <<PK>> PK_T_Clase B6()

T_Clase A llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase A5()

<<Identifying>> 0..* 0..1

T_Clase B llave de B : NUMBER(5, 0) llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase B6() <<FK>> FK_T_Clase B2()

UPC - Análisis y Diseño Orientado a Objetos

40

17/04/08

Convirtiendo asociación en relación
Elemento del Elementos del Modelo de Análisis Modelo de Datos Asociación simple Relación no identificante Resultado Cada asociación simple se transforma en una relación no identificante entre las tablas (en el sentido contrario a la navegabilidad)

UPC - Análisis y Diseño Orientado a Objetos

41

17/04/08

Convirtiendo asociación en relación
Clase A llave de A
1

Clase B llave de B
*

<<Non-Identifying>> T_Clase A llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase A5() 0..1 0..*

T_Clase B llave de B : NUMBER(5, 0) llave de A : NUMBER(5, 0) <<PK>> PK_T_Clase B6() <<FK>> FK_T_Clase B2() <<Index>> TC_T_Clase B7()

UPC - Análisis y Diseño Orientado a Objetos

42

17/04/08

Convirtiendo asociación en relación
Elemento del Elementos del Modelo de Análisis Modelo de Datos Asociación múltiple Tablas separadas (Clase asociación) Resultado Cada asociación múltiple (clase asociación) se transforma en una tabla de separada.

UPC - Análisis y Diseño Orientado a Objetos

43

17/04/08

Convirtiendo asociación en relación
clase AA llav e de AA 1..n 1..n clase BB llav e de BB Cla se As oc iac ion atributo de la asociacion
T_clase AA llave de AA : NUMBER(5, 0) <<PK>> PK_T_clase AA23() <<I dentifying >> 1 0..* T_clase BB llave de BB : NUMBER(5, 0) <<PK>> PK_T_clase BB24() 1 <<Identifying>>

0..*

T_Clase Asociacion atributo de la asociacion : NUMBER(5, 0) llave de BB : NUMBER(5, 0) llave de AA : NUMBER(5, 0) <<PK>> PK_T_Clase Asociacion25() <<FK>> FK_T_Clase Asociacion11() <<FK>> FK_T_Clase Asociacion10() <<Index>> TC_T_Clase Asociacion32() <<Index>> TC_T_Clase Asociacion31()

UPC - Análisis y Diseño Orientado a Objetos

44

17/04/08

Convirtiendo asociación en relación
Elemento del Modelo de Análisis Asociación composición Asociación agregación Elementos del Modelo de Datos Relación identificante Resultado Cada composición se transforma en una relación identificante entre las tablas correspondientes. La clase que representa a la parte absorbe la llave de la clase compuesta
45 17/04/08

UPC - Análisis y Diseño Orientado a Objetos

Convirtiendo asociación en relación
Todo llave de Todo 1
T_Todo llave de Todo : NUMBER(5, 0) <<PK>> PK_T_Todo19() 1 <<Identif ying>>

+partes

1..n

1..*

Parte llave de Parte
T_Parte llave de Parte : NUMBER(5, 0) llave de Todo : NUMBER(5, 0) <<PK>> PK_T_Parte20() <<FK>> FK_T_Parte8() <<Index>> TC_T_Parte27()

UPC - Análisis y Diseño Orientado a Objetos

46

17/04/08

Convirtiendo asociación en relación
Elemento del Elementos del Modelo de Análisis Modelo de Datos Asociación Tablas separadas generalización Resultado Cada subclase se transforma en una tabla. La superclase se transforma en una tabla padre con una relación identificante de 0 a N con cada subclase

UPC - Análisis y Diseño Orientado a Objetos

47

17/04/08

Convirtiendo asociación en relación
Superclase llave superclase T_Superclase llave su perclase : N UMBER(5, 0) <<PK>> PK_T_Sup erclase21() 1 <<Identifying >> 0..* Subclase llave subclase T_Subclase llave su bclase : NUMBER(5, 0) llave su perclase : N UMBER(5, 0) <<PK>> PK_T_Sub clase 22() <<FK>> FK_T_Subclase9()

UPC - Análisis y Diseño Orientado a Objetos

48

17/04/08

¿El resultado de la transformación?
• Se crea el Modelo de
Datos. • Se agrega el paquete Schema dentro de la Vista Lógica. • Se agrega un paquete con el nombre definido.

UPC - Análisis y Diseño Orientado a Objetos

49

17/04/08

Ejemplo
escribe 1..n Autor codAutor : Long nombre : String apellidos : String sexo : Boolean fechaNacimiento : Date 0..n 1..n Libro codLibro : Long titulo : String fechaEdicion : Date 1 contiene 1..n Ejemplar codEjemplar : Integer 1..n solicita 1..n Prestamo fechaPrestamo : Date fechaDevolucion : Date

nació

Aut or-Libro principal : Boolean tema : String

Usuario codUsuario : Integer nombre : String apellidos : String sexo : Boolean

1

Pais codPais : Integer descripcion : String Est udiante carrera : String Profesor departamento : String

UPC - Análisis y Diseño Orientado a Objetos

50

17/04/08

Resultado en SQL
TAutor codAutor : INTEGER nombre : VARCHAR(255) apellidos : VARCHAR(255) sexo : SMALLINT fechaNacimiento : DATE TAutor_ID : INTEGER TPais_ID : INTEGER <<PK>> PK_TAutor0() <<FK>> FK_TAutor5() <<Index>> TC_TAutor8() 0..* <<Non-Identifying>> 1 TLibro codLibro : INTEGER titulo : VARCHAR(255) fechaEdicion : DATE TLibro_ID : INTEGER <<PK>> PK_TLibro1() 1 <<Ident ifying>> 1 <<Ident ifying>> 0..* TAutor-Libro principal : SMALLINT tema : VARCHAR(255) TLibro_ID : INTEGER TAutor_ID : INTEGER <<PK>> PK_TAutor-Libro2() <<FK>> FK_TAutor-Libro0() <<FK>> FK_TAutor-Libro1() <<Index>> TC_TAutor-Libro0() <<Index>> TC_TAutor-Libro1() TUsuario 0.. * TPrestamo fechaPrestamo : DATE fechaDevolucion : DATE TUsuario_ID : INTEGER <<Identifying>> TLibro_ID : INTEGER 0..* <<PK>> PK_TPrestamo5() <<FK>> FK_TPrestamo4() <<FK>> FK_TPrestamo3() <<Index>> TC_TPrestamo3() <<Index>> TC_TPrestamo4() <<Identifying>> <<Ident ifying>> 1 1..* TEjemplar codEjemplar : INTEGER TLibro_ID : INTEGER <<PK>> PK_TEjemplar3() <<FK>> FK_TEjemplar2() <<Index>> TC_TEjemplar9() 1 0..*

TPais codPais : INTEGER descripcion : VARCHAR(255) TPais_ID : INTEGER <<PK>> PK_TPais8()

codUsuario : INTEGER nombre : VARCHAR(255) apellidos : VARCHAR(255) 1 sexo : SMALLINT TUsuario_ID : INTEGER <<PK>> PK_TUsuario4() 1 1 0..1

<<Identifying>>

<<Identifying>>

0.. 1

TEstudiante carrera : VARCHAR(255) TUsuario_ID : INTEGER <<PK>> PK_TEstudiant e9() <<FK>> FK_TEstudiante6() <<Index>> TC_TEst udiante10()

TProfesor departamento : V ARCHAR(255) TUsuario_ID : INTEGER <<PK>> PK_TProfesor10() <<FK>> FK_TProfes or7() <<Index>> TC_TProfesor11()

UPC - Análisis y Diseño Orientado a Objetos

51

17/04/08

Transformación Modelo Análisis - Modelo Datos
6. Construir el Diagrama del Modelo de Datos.

 

Una vista gráfica del Modelo de Datos se puede consultar creando un Diagrama del Modelo de Datos en el interior del esquema correspondiente. El Modelador de Datos, creará un diagrama vacío y activará una barra de herramientas. Para ver gráficamente una tabla basta con arrastrarla hacia el diagrama y el Modelador de Datos mostrará automáticamente las relaciones de dicha tabla con el resto.
UPC - Análisis y Diseño Orientado a Objetos 52 17/04/08

Transformación Modelo Análisis - Modelo Datos
6. Construir el Diagrama del Modelo de Datos.
1. 2. 3.

Seleccionar el esquema dentro del cual estará el Diagrama del Modelo de Datos. Hacer click derecho y seleccionar Data Modeler / New / Data Model Diagram. Indicar el nombre el Diagrama del Modelo de Datos.

UPC - Análisis y Diseño Orientado a Objetos

53

17/04/08

Generando la Base de Datos Física y/o Script
UPC - Análisis y Diseño Orientado a Objetos 54 17/04/08

Generando la Base de Datos y/o Script

1. Seleccionar el esquema que contiene el Modelo de

Datos. 2. Hacer clic derecho y seleccionar Data Modeler / Forward Engineer. 3. En el formulario de generación especificar si desea generar el modelo de datos hacia un archivo DDL o hacia un motor de base de datos. 4. Hacer efectiva la generación. 5. Consultar la ventana de Logs, para conocer si hubo errores.
UPC - Análisis y Diseño Orientado a Objetos 55 17/04/08

Generando la Base de Datos y/o Script

UPC - Análisis y Diseño Orientado a Objetos

56

17/04/08

Generando la Base de Datos y/o Script

UPC - Análisis y Diseño Orientado a Objetos

57

17/04/08

Conclusiones
• El Modelador de Datos de Rational Rose permite
obtener:
El Modelo de Datos.  El Modelo de Almacenamiento.  La Base de Datos física.  El script de la Base de Datos.

UPC - Análisis y Diseño Orientado a Objetos

58

17/04/08

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.