Condividi tramite


Regole per la generazione di database (Generazione guidata database)

La procedura guidata Crea database consente di generare uno schema di database da un modello concettuale tramite una strategia di mapping tabella per tipo. Tabella per tipo è una strategia di mapping in cui tutte le proprietà non ereditate per ogni tipo di entità sono mappate a tabelle di database separate. In questo argomento vengono descritte le regole utilizzate per generare lo schema del database.

Per ulteriori informazioni, vedere Procedura: generare un database da un modello concettuale (strumenti di Entity Data Model) e Procedura: personalizzare la generazione di database (procedura guidata Crea database).

Tabelle e tipi di entità

Nella tabella seguente viene indicato come si creano le tabelle basate sui tipi di entità:

Nome tabella

Colonne1 create

Chiave primaria

Chiavi esterne

Tipo non derivato

Il nome dell'elemento EntitySet del tipo.

Una colonna per ogni proprietà scalare, inclusa ogni proprietà scalare delle proprietà del tipo complesso.

Colonna o colonne che corrispondono alla proprietà o alle proprietà di chiave di entità.

Vedere la seguente sezione "Associazioni e chiavi esterne".

Tipo derivato

Concatenazione del nome del tipo e del nome dell'elemento EntitySet del tipo di base.

Una colonna per ogni proprietà scalare non-ereditata (inclusa ogni proprietà scalare delle proprietà del tipo complesso) e una colonna per ogni proprietà di chiave ereditata.

Colonna o colonne che corrispondono alla proprietà o alle proprietà di chiave di entità ereditate.

La chiave primaria della tabella figlio è anche una chiave esterna che fa riferimento alla chiave primaria della tabella padre.

È possibile che vengano create chiavi esterne aggiuntive. Per ulteriori informazioni, vedere la seguente sezione "Associazioni e chiavi esterne".

  1. È possibile aggiungere ulteriori colonne per le proprietà di navigazione. Per ulteriori informazioni, vedere la sezione "Associazioni e chiavi esterne" più avanti in questo argomento.

Esempio

Nell'esempio seguente viene indicato il linguaggio DDL (Data Definition Language) generato per un modello con la descrizione seguente:

  • Tipo di entità della persona (set di entità: PersonSet):

    • PersonID (proprietà chiave, Int32)

    • LastName (String)

    • FirstName (String)

  • Tipo di entità Instructor (eredita da Person, non sono elencate le proprietà ereditate):

    • DepartmentID (Int32)

    • OfficeLocation (String)

Codice

-- --------------------------------------------------
-- 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

Associazioni e chiavi esterne

Nella tabella seguente vengono descritte le regole di generazione DDL per le associazioni. Notare che per tutte le associazioni viene creato un vincolo di chiave esterna.

Tipo di associazione Regola di generazione di chiave esterna

Uno-a-zero-o-uno (1:0..1)

- oppure -

Uno-a-molti (1:*)

Se non è definito alcun vincolo referenziale per l'associazione, le colonne vengono aggiunte alla tabella corrispondente al tipo di entità per l'estremità 0..1 o * dell'associazione. Le colonne aggiunte dispongono di vincoli di chiave esterna che fanno riferimento alla chiave primaria della tabella corrispondente al tipo di entità sull'altra estremità dell'associazione. Le colonne della tabella aggiunte sono mappate all'associazione e non al tipo di entità. Il nome di ogni colonna aggiunta è la concatenazione del nome della proprietà di navigazione e del nome della proprietà chiave.

Se in un modello concettuale esiste un vincolo referenziale per l'associazione, alla tabella del database non vengono aggiunte ulteriori colonne. Al contrario, viene creato un vincolo di chiave esterna. Il vincolo creato nel database rispecchia il vincolo nel modello concettuale: le colonne corrispondenti alle proprietà dipendenti nel modello concettuale fanno riferimento alle colonne di chiave primaria corrispondenti alla chiave di entità. Il nome del vincolo di chiave esterna è il nome dell'associazione. Per ulteriori informazioni, vedere Procedura: aggiungere e modificare vincoli referenziali (strumenti di Entity Data Model).

Uno-a-uno (1:1)

Se non è definito alcun vincolo referenziale per l'associazione, le colonne vengono aggiunte a una delle tabelle corrispondenti ai tipi di entità per le estremità dell'associazione. La tabella alla quale vengono aggiunte le colonne viene scelta in modo arbitrario. Le colonne aggiunte dispongono di vincoli di chiave esterna che fanno riferimento alla chiave primaria della tabella corrispondente al tipo di entità sull'altra estremità dell'associazione. Le colonne aggiunte sono mappate all'associazione e non al tipo di entità. Il nome di ogni colonna aggiunta è la concatenazione del nome della proprietà di navigazione e del nome della proprietà chiave.

Se in un modello concettuale esiste un vincolo referenziale per l'associazione, alla tabella del database non vengono aggiunte ulteriori colonne. Al contrario, viene creato un vincolo di chiave esterna. Il vincolo creato nel database rispecchia il vincolo nel modello concettuale: le colonne corrispondenti alle proprietà dipendenti nel modello concettuale fanno riferimento alle colonne di chiave primaria corrispondenti alla chiave di entità. Il nome del vincolo di chiave esterna è il nome dell'associazione. Per ulteriori informazioni, vedere Procedura: aggiungere e modificare vincoli referenziali (strumenti di Entity Data Model).

Molti-a-molti (*:*)

Viene creata la tabella di join. Per ogni proprietà chiave in ogni tipo di entità, viene aggiunta una colonna alla tabella. Le colonne dispongono di vincoli di chiave esterna che fanno riferimento alle chiavi primarie delle tabelle create sulla base dei tipi di entità per le estremità dell'associazione. La chiave primaria della tabella creata sarà composta dalla chiave primaria che è costituita da tutte le colonne della tabella.

Il nome della tabella creata è uguale al nome dell'elemento AssociationSet.

Esempio

Nell'esempio seguente è illustrato il codice DDL che viene generato da un'associazione 1:*. In questo modello è presente un'associazione 1: * tra l'entità Subject e l'entità Course:

  • Tipo di entità Subject (set di entità: SubjectSet):

    • SubjectID (proprietà chiave, Int32)

    • DepartmentID (proprietà chiave, Int32)

    • SubjectName (String)

  • Tipo di entità Course (set di entità: CourseSet):

    • CourseID (proprietà chiave, Int32)

    • SectionID (proprietà chiave, Int32)

    • CourseName (String)

Codice

-- --------------------------------------------------
-- 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

Esempio

Nell'esempio seguente è illustrato il codice DDL che viene generato da un'associazione *:*. In questo modello è presente un'associazione *: * tra l'entità Student e l'entità Course:

  • Tipo di entità Student (set di entità: StudentSet):

    • StudentID (proprietà chiave, Int32)

    • LastName (String)

    • FirstName (String)

  • Tipo di entità Course (set di entità: CourseSet):

    • CourseID (proprietà chiave, Int32)

    • SectionID (proprietà chiave, Int32)

    • CourseName (String)

Codice

-- --------------------------------------------------
-- 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

Esempio

Nell'esempio seguente è illustrato il codice DDL generato per un'associazione 1:0..1 quando nell'associazione esiste un vincolo referenziale. In questo modello, InstructorId è la chiave principale del vincolo referenziale e OfficeId è la chiave dipendente:

  • Tipo di entità Instructor (set di entità: InstructorSet):

    • InstructorId (proprietà chiave, Int32)

    • LastName (String)

    • FirstName (String)

  • Tipo di entità Office (set di entità: OfficeSet):

    • OfficeID (proprietà chiave, Int32)

    • Location (proprietà chiave, String)

Codice

-- --------------------------------------------------
-- 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

Colonne e tipi complessi

Se un tipo di entità dispone di una proprietà ComplexType, per ogni proprietà scalare di ComplexType viene aggiunta una colonna alla tabella creata sulla base del tipo di entità. Il nome di ogni colonna è la concatenazione del nome della proprietà ComplexType, un carattere di sottolineatura ("_") e del nome della proprietà corrispondente di ComplexType. Ad esempio, si supponga che un'entità dispone di una proprietà ComplexType con nome EntityProperty1 e che ComplexType dispone di due proprietà scalari, CTProperty1 e CTProperty2. Le colonne aggiunte alla tabella sono EntityProperty1_CTProperty1 e EntityProperty1_CTProperty2.

Esempio

Nell'esempio seguente è illustrato il codice DDL che viene generato per un'entità con una proprietà ComplexType:

  • Tipo di entità Instructor (set di entità: InstructorSet):

    • InstructorID (proprietà chiave, Int32)

    • LastName (String)

    • FirstName (String)

    • ContactInfo (di ComplexType ContactInformation)

  • ContactInformation ComplexType:

    • HomePhone (String)

    • CellPhone (String)

    • EmailAddress (String)

Codice

-- --------------------------------------------------
-- 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

Tipi di dati e facet

I facet rappresentano i vincoli del tipo di dati sulle proprietà di entità. In Generazione guidata database è possibile eseguire le seguenti attività con i facet specificati nel linguaggio CSDL (Conceptual Schema Definition Language):

  • Copia i facet dagli elementi Property in CSDL agli elementi Property corrispondenti nel linguaggio SSDL (Store Schema Definition Language).

  • Converte i facet in istruzioni o vincoli nel linguaggio DDL:

    • I facet MaxLength, FixedLength, Precision, Scale e Unicode vengono convertiti in modificatori del tipo di dati nelle colonne.

    • Il facet Collation viene convertito in un'istruzione COLLATE.

    • Se il facet StoreGeneratedPattern è impostato su identity (StoreGeneratedPattern="identity") ed il tipo di proprietà è int, bigint, smallint, tinyint o decimal, la colonna del database interessata sarà creata con la specifica IDENTITY(1,1). Per ulteriori informazioni, vedere Facets (CSDL) e Procedura: modificare valori di facet (strumenti di Entity Data Model).

Indici

Gli indici cluster vengono creati nelle chiavi primarie per ogni tabella. Tutti gli indici sono in ordine crescente.

Istruzioni DROP

Se un modello di archiviazione è già definito quando si esegue la procedura guidata Crea database, il codice DDL generato conterrà rispettivamente un'istruzione DROP TABLE e un'istruzione DROP CONSTRAINT per ogni EntitySet e ogni AssociationSet derivati dal modello di archiviazione.

Vedere anche

Concetti

ADO.NET Entity Data Model Designer

Altre risorse

Procedura guidata Crea database (strumenti di Entity Data Model)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications