Reglas de generación de bases de datos (Asistente para generar base de datos)

El Asistente para crear bases de datos genera un esquema de bases de datos a partir de un modelo conceptual mediante una estrategia de asignación de tabla por tipo. Esta estrategia es una estrategia de asignación en la que todas las propiedades no heredadas de cada tipo de entidad se asignan a tablas de base de datos independientes. En este tema se describen las reglas que se usan para generar el esquema de base de datos.

Para obtener más información, vea Cómo: Generar una base de datos a partir de un modelo conceptual (Herramientas de Entity Data Model) y Cómo: Personalizar la generación de bases de datos (Asistente para generar base de datos).

Tablas y tipos de entidad

En la siguiente tabla se describe cómo se crean las tablas basándose en los tipos de entidad:

Nombre de tabla

Columnas1 creadas

Clave principal

Claves externas

Sin tipo derivado

El nombre del elemento EntitySet del tipo.

Columna de cada propiedad escalar, incluidas todas las propiedades escalares de las propiedades de tipo complejo.

Columna o columnas que corresponden a la propiedad o propiedades de la clave de entidad.

Vea la sección "Asociaciones y claves externas" más adelante en este tema.

Tipo derivado

Concatenación del nombre de elemento de EntitySet de tipo base y del nombre de tipo.

Una columna para cada propiedad escalar no heredada (incluidas todas las propiedades escalares de propiedades de tipo complejo) y otra para cada propiedad clave heredada.

Columna o columnas que corresponden a la propiedad o propiedades de la clave de entidad heredadas.

La clave principal de la tabla secundaria también es una clave externa que hace referencia a la clave principal de su tabla primaria.

Se pueden crear claves externas adicionales. Para obtener más información, vea la sección "Asociaciones y claves externas" más adelante en este tema.

  1. Se pueden agregar columnas adicionales para propiedades de navegación. Para obtener más información, vea la sección "Asociaciones y claves externas" más adelante en este tema.

Ejemplo

En el siguiente ejemplo se muestra el lenguaje de descripción de datos (DDL) generado para un modelo con la siguiente descripción:

  • Tipo de entidad Person (conjunto de entidades: PersonSet):

    • PersonID (propiedad clave, Int32)

    • LastName (String)

    • FirstName (String)

  • Tipo de entidad Instructor (hereda de Person, las propiedades heredadas no se muestran):

    • DepartmentID (Int32)

    • OfficeLocation (String)

Código

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'PersonSet'
CREATE TABLE [PersonSet] (
      [PersonID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'PersonSet_Instructor'
CREATE TABLE [PersonSet_Instructor] (
      [DepartmentID] int  NOT NULL,
      [OfficeLocation] nvarchar(max)  NOT NULL,
      [PersonID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [PersonID] in table 'PersonSet'
ALTER TABLE [PersonSet] WITH NOCHECK
ADD CONSTRAINT [PK_PersonSet]
      PRIMARY KEY CLUSTERED ([PersonID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [PersonID] in table 'PersonSet_Instructor'
ALTER TABLE [PersonSet_Instructor] WITH NOCHECK
ADD CONSTRAINT [PK_PersonSet_Instructor]
      PRIMARY KEY CLUSTERED ([PersonID] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [PersonID] in table 'PersonSet_Instructor'
ALTER TABLE [PersonSet_Instructor] WITH NOCHECK
ADD CONSTRAINT [FK_Instructor_inherits_Person]
    FOREIGN KEY ([PersonID])
    REFERENCES [PersonSet]
        ([PersonID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

Asociaciones y claves externas

En la siguiente tabla se describen las reglas de generación de DDL para las asociaciones. Tenga en cuenta que se crea una restricción de clave externa para todas las asociaciones.

Tipo de asociación Regla de generación de clave externa

Uno a cero o uno (1:0..1)

– O bien –

Uno a varios (1:*)

Si no se define ninguna restricción referencial en la asociación, se agregan columnas a la tabla que corresponden al tipo de entidad 0..1 o * extremo de la asociación. Las columnas agregadas tiene restricciones de clave externa que hacen referencia a la clave principal de la tabla que corresponde al tipo de entidad en el otro extremo de la asociación. Las columnas de tabla agregadas se asignan a la asociación, no al tipo de entidad. El nombre de cada columna agregada es la concatenación del nombre de propiedad de navegación y del nombre de propiedad de clave.

Si existe una restricción referencial en la asociación del modelo conceptual, no se agregan columnas adicionales a la tabla de base de datos. En su lugar, se crea una restricción de tabla externa. La restricción que se crea en la base de datos refleja la restricción del modelo conceptual: las columnas que corresponden a las propiedades dependientes del modelo conceptual hacen referencia a las columnas de clave principal que corresponden a la clave de entidad. El nombre de la restricción de la clave externa es el nombre de la asociación. Para obtener más información, vea Cómo: Agregar y editar restricciones referenciales (Herramientas de Entity Data Model).

Uno a uno (1:1)

Si no se define ninguna restricción referencial en la asociación, se agregan columnas a una de las tablas que corresponden a los tipos de entidad de los extremos de la asociación. La tabla a la que se agregan las columnas se elige arbitrariamente. Las columnas agregadas tiene restricciones de clave externa que hacen referencia a la clave principal de la tabla que corresponde al tipo de entidad en el otro extremo de la asociación. Las columnas agregadas se asignan a la asociación, no al tipo de entidad. El nombre de cada columna agregada es la concatenación del nombre de propiedad de navegación y del nombre de propiedad de clave.

Si existe una restricción referencial en la asociación del modelo conceptual, no se agregan columnas adicionales a la tabla de base de datos. En su lugar, se crea una restricción de tabla externa. La restricción que se crea en la base de datos refleja la restricción del modelo conceptual: las columnas que corresponden a las propiedades dependientes del modelo conceptual hacen referencia a las columnas de clave principal que corresponden a la clave de entidad. El nombre de la restricción de la clave externa es el nombre de la asociación. Para obtener más información, vea Cómo: Agregar y editar restricciones referenciales (Herramientas de Entity Data Model).

Varios a varios (*:*)

Se crea una tabla combinada. Por cada propiedad de clave de cada tipo de entidad, se agrega una columna a la tabla. Las columnas tienen restricciones de clave externa que hacen referencia a las claves principales de las tablas creadas basándose en los tipos de entidad en los extremos de la asociación. La clave primaria de la tabla creada será una clave principal compuesta formada por todas las columnas de la tabla.

El nombre de la tabla creada es el mismo que el nombre del elemento AssociationSet.

Ejemplo

En el siguiente ejemplo se muestra el DDL generado para una asociación 1:*. En este modelo, existe una asociación 1:* entre la entidad Subject y la entidad Course:

  • Tipo de entidad Subject (conjunto de entidades: SubjectSet):

    • SubjectID (propiedad clave, Int32)

    • DepartmentID (propiedad clave, Int32)

    • SubjectName (String)

  • Tipo de entidad Course (conjunto de entidades: CourseSet):

    • CourseID (propiedad clave, Int32)

    • SectionID (propiedad clave, Int32)

    • CourseName (String)

Código

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'SubjectSet'
CREATE TABLE [SubjectSet] (
      [SubjectID] int  NOT NULL,
      [DepartmentID] int  NOT NULL,
      [SubjectName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'CourseSet'
CREATE TABLE [CourseSet] (
      [CourseID] int  NOT NULL,
      [SectionID] int  NOT NULL,
      [CourseName] nvarchar(max)  NOT NULL,
      [Subject_SubjectID] int  NOT NULL,
      [Subject_DepartmentID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [SubjectID], [DepartmentID] in 
-- table 'SubjectSet'
ALTER TABLE [SubjectSet] WITH NOCHECK
ADD CONSTRAINT [PK_SubjectSet]
      PRIMARY KEY CLUSTERED ([SubjectID], [DepartmentID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [CourseID], [SectionID] in table 'CourseSet'
ALTER TABLE [CourseSet] WITH NOCHECK
ADD CONSTRAINT [PK_CourseSet]
      PRIMARY KEY CLUSTERED ([CourseID], [SectionID] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [Subject_SubjectID], [Subject_DepartmentID]
-- in table 'CourseSet'
ALTER TABLE [CourseSet] WITH NOCHECK
ADD CONSTRAINT [SubjectCourse]
    FOREIGN KEY ([Subject_SubjectID], [Subject_DepartmentID])
    REFERENCES [SubjectSet]
        ([SubjectID], [DepartmentID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

Ejemplo

En el siguiente ejemplo se muestra el DDL generado para una asociación *:*. En este modelo, existe una asociación *:* entre la entidad Student y la entidad Course:

  • Tipo de entidad Student (conjunto de entidades: StudentSet):

    • StudentID (propiedad clave, Int32)

    • LastName (String)

    • FirstName (String)

  • Tipo de entidad Course (conjunto de entidades: CourseSet):

    • CourseID (propiedad clave, Int32)

    • SectionID (propiedad clave, Int32)

    • CourseName (String)

Código

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'StudentSet'
CREATE TABLE [StudentSet] (
      [StudentID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'CourseSet'
CREATE TABLE [CourseSet] (
      [CourseID] int  NOT NULL,
      [SectionID] int  NOT NULL,
      [CourseName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'StudentCourse'
CREATE TABLE [StudentCourse] (
      [Student_StudentID] int  NOT NULL,
      [Course_CourseID] int  NOT NULL,
      [Course_SectionID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [StudentID] in table 'StudentSet'
ALTER TABLE [StudentSet] WITH NOCHECK
ADD CONSTRAINT [PK_StudentSet]
      PRIMARY KEY CLUSTERED ([StudentID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [CourseID], [SectionID] in table 'CourseSet'
ALTER TABLE [CourseSet] WITH NOCHECK
ADD CONSTRAINT [PK_CourseSet]
      PRIMARY KEY CLUSTERED ([CourseID], [SectionID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [Student_StudentID], [Course_CourseID],
-- [Course_SectionID] in table 'StudentCourse'
ALTER TABLE [StudentCourse] WITH NOCHECK
ADD CONSTRAINT [PK_StudentCourse]
      PRIMARY KEY CLUSTERED ([Student_StudentID], [Course_CourseID], [Course_SectionID] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [Student_StudentID] in table 'StudentCourse'
ALTER TABLE [StudentCourse] WITH NOCHECK
ADD CONSTRAINT [FK_StudentCourse_StudentSet]
    FOREIGN KEY ([Student_StudentID])
    REFERENCES [StudentSet]
        ([StudentID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO
-- Creating foreign key on [Course_CourseID], [Course_SectionID] in table 'StudentCourse'
ALTER TABLE [StudentCourse] WITH NOCHECK
ADD CONSTRAINT [FK_StudentCourse_CourseSet]
    FOREIGN KEY ([Course_CourseID], [Course_SectionID])
    REFERENCES [CourseSet]
        ([CourseID], [SectionID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

Ejemplo

En el siguiente ejemplo se muestra el DDL generado para una asociación 1:0..1 cuando existe una restricción referencial en la asociación. En este modelo, InstructorId es la clave principal de la restricción referencial y OfficeId es la clave dependiente:

  • Tipo de entidad Instructor (conjunto de entidades: InstructorSet):

    • InstructorId (propiedad clave, Int32)

    • LastName (String)

    • FirstName (String)

  • Tipo de entidad Office (conjunto de entidades: OfficeSet):

    • OfficeID (propiedad clave, Int32)

    • Location (propiedad clave, String)

Código

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'InstructorSet'
CREATE TABLE [InstructorSet] (
      [InstructorID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL
);
GO
-- Creating table 'OfficeSet'
CREATE TABLE [OfficeSet] (
      [OfficeID] int  NOT NULL,
      [Location] nvarchar(max)  NOT NULL,
      [Instructor_InstructorID] int  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [InstructorID] in table 'InstructorSet'
ALTER TABLE [InstructorSet] WITH NOCHECK
ADD CONSTRAINT [PK_InstructorSet]
     PRIMARY KEY CLUSTERED ([InstructorID] ASC)
    ON [PRIMARY]
GO
-- Creating primary key on [OfficeID], [Location] in table 'OfficeSet'
ALTER TABLE [OfficeSet] WITH NOCHECK
ADD CONSTRAINT [PK_OfficeSet]
      PRIMARY KEY CLUSTERED ([OfficeID], [Location] ASC)
    ON [PRIMARY]
GO

-- --------------------------------------------------
-- Creating All Foreign Key Constraints
-- --------------------------------------------------

-- Creating foreign key on [Instructor_InstructorID] in 
-- table 'OfficeSet'
ALTER TABLE [OfficeSet] WITH NOCHECK
ADD CONSTRAINT [InstructorOffice]
    FOREIGN KEY ([Instructor_InstructorID])
    REFERENCES [InstructorSet]
        ([InstructorID])
    ON DELETE NO ACTION ON UPDATE NO ACTION
GO

Tipos complejos y columnas

Si un tipo de entidad tiene una propiedad ComplexType, se agrega una columna por cada propiedad escalar de ComplexType a la tabla que se crea basándose en el tipo de entidad. El nombre de cada columna es la concatenación del nombre de propiedad ComplexType, un carácter de subrayado ("_") y el nombre de la propiedad correspondiente de ComplexType. Por ejemplo, supongamos que una entidad tiene una propiedad ComplexType con el nombre EntityProperty1 y ComplexType tiene dos propiedades escalares, CTProperty1 y CTProperty2. Las columnas agregadas a la tabla son EntityProperty1_CTProperty1 y EntityProperty1_CTProperty2.

Ejemplo

En el siguiente ejemplo se muestra el DDL generado para una entidad con una propiedad ComplexType:

  • Tipo de entidad Instructor (conjunto de entidades: InstructorSet):

    • InstructorID (propiedad clave, Int32)

    • LastName (String)

    • FirstName (String)

    • ContactInfo (de ContactInformation de ComplexType)

  • ComplexType: de ContactInformation

    • HomePhone (String)

    • CellPhone (String)

    • EmailAddress (String)

Código

-- --------------------------------------------------
-- Creating All Tables
-- --------------------------------------------------

-- Creating table 'InstructorSet'
CREATE TABLE [InstructorSet] (
      [InstructorID] int  NOT NULL,
      [LastName] nvarchar(max)  NOT NULL,
      [FirstName] nvarchar(max)  NOT NULL,
      [ContactInfo_HomePhone] nvarchar(max)  NOT NULL,
      [ContactInfo_CellPhone] nvarchar(max)  NOT NULL,
      [ContactInfo_EmailAddress] nvarchar(max)  NOT NULL
);
GO

-- --------------------------------------------------
-- Creating All Primary Key Constraints
-- --------------------------------------------------

-- Creating primary key on [InstructorID] in table 'InstructorSet'
ALTER TABLE [InstructorSet] WITH NOCHECK
ADD CONSTRAINT [PK_InstructorSet]
      PRIMARY KEY CLUSTERED ([InstructorID] ASC)
    ON [PRIMARY]
GO

Facetas y tipos de datos

Las facetas representan restricciones de tipos de datos en las propiedades de entidad. El Asistente para generar base de datos realiza las siguientes acciones con las facetas especificadas en el lenguaje de definición de esquemas conceptuales (CSDL):

  • Copia las facetas desde los elementos Property de CSDL en los elementos Property correspondiente del lenguaje de definición de esquemas de almacenamiento (SSDL).

  • Traduce las facetas en instrucciones o restricciones en el DDL:

    • Las facetas MaxLength, FixedLength, Precision, Scale y Unicode se traducen en columnas en los modificadores de tipo de datos.

    • La faceta Collation se traduce en una instrucción COLLATE.

    • Si la faceta StoreGeneratedPattern se establece en identity (StoreGeneratedPattern="identity") y el tipo de propiedad es int, bigint, smallint, tinyint o decimal, se creará la columna de base de datos afectada con la especificación IDENTITY(1,1). Para obtener más información, vea Facets (CSDL) y Cómo: Modificar valores de faceta (herramientas de Entity Data Model).

Índices

Se crea índices clúster en las claves principales para cada tabla. El orden de todos los índices es ascendente.

Instrucciones DROP

Si ya se ha definido un modelo de almacenamiento al ejecutar el Asistente para crear base de datos, el DDL generado contendrá una instrucción DROP TABLE y una instrucción DROP CONSTRAINT para cada EntitySet y AssociationSet (respectivamente) que se deducen del modelo de almacenamiento.

Vea también

Conceptos

ADO.NET Entity Data Model Designer

Otros recursos

Asistente para generar base de datos (Herramientas de Entity Data Model)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications