Share via


Datenbankgenerierungsregeln (Assistent zur Datenbankgenerierung)

Der Assistent zum Generieren von Datenbanken generiert aus einem konzeptionellen Modell mit einer "Tabelle pro Typ"-Zuordnungsstrategie ein Datenbankschema. Eine "Tabelle pro Typ"-Zuordnungsstrategie ist eine Zuordnungsstrategie, bei der alle nicht geerbten Eigenschaften für jeden Entitätstyp getrennten Datenbanktabellen zugeordnet werden. In diesem Thema werden die Regeln beschrieben, die verwendet werden, um das Datenbankschema zu generieren.

Weitere Informationen finden Sie unter Gewusst wie: Generieren einer Datenbank aus einem konzeptionellen Modell (Entity Data Model-Tools) und Gewusst wie: Anpassen der Datenbankgenerierung (Assistent zur Datenbankgenerierung).

Entitätstypen und Tabellen

In der folgenden Tabelle wird beschrieben, wie auf der Grundlage von Entitätstypen Tabellen erstellt werden:

Tabellenname

Erstellte Spalten1

Primärschlüssel

Fremdschlüssel

Nicht abgeleiteter Typ

Der EntitySet-Elementname des Typs.

Eine Spalte für jede skalare Eigenschaft, einschließlich jeder skalaren Eigenschaft komplexer Typeigenschaften.

Spalte oder Spalten, die der Entitätsschlüsseleigenschaft oder den -eigenschaften entsprechen.

Weitere Informationen finden Sie im Abschnitt "Zuordnungen und Fremdschlüssel" weiter unten in diesem Thema.

Abgeleiteter Typ

Verkettung des EntitySet-Elementnamens und des Typnamens des Basistyps.

Eine Spalte für jede nicht geerbte skalare Eigenschaft (einschließlich jeder skalaren Eigenschaft komplexer Typeigenschaften) sowie eine Spalte für jede geerbte Schlüsseleigenschaft.

Spalte oder Spalten, die der geerbten Entitätsschlüsseleigenschaft oder den geerbten -eigenschaften entsprechen.

Der Primärschlüssel der untergeordneten Tabelle ist auch ein Fremdschlüssel, der auf den Primärschlüssel seiner übergeordneten Tabelle verweist.

Möglicherweise werden zusätzliche Fremdschlüssel erstellt. Weitere Informationen finden Sie im Abschnitt "Zuordnungen und Fremdschlüssel" weiter unten in diesem Thema.

  1. Für Navigationseigenschaften können weitere Spalten hinzugefügt werden. Weitere Informationen finden Sie im Abschnitt "Zuordnungen und Fremdschlüssel" weiter unten in diesem Thema.

Beispiel

Im folgenden Beispiel wird die Datenbeschreibungssprache (DDL) gezeigt, die für ein Modell mit der folgenden Beschreibung generiert wurde:

  • Person-Entitätstyp (Entitätenmenge: PersonSet):

    • PersonID (Schlüsseleigenschaft, Int32)

    • LastName (String)

    • FirstName (String)

  • Instructor-Entitätstyp (erbt von Person, geerbte Eigenschaften sind nicht aufgeführt):

    • DepartmentID (Int32)

    • OfficeLocation (String)

Code

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

Zuordnungen und Fremdschlüssel

In der folgenden Tabelle werden die DDL-Generierungsregeln für Zuordnungen beschrieben. Beachten Sie, dass für alle Zuordnungen eine Fremdschlüsseleinschränkung erstellt wird.

Zuordnungstyp Fremdschlüsselgenerierungsregel

1:0 oder 1:1 (1:0..1)

- oder -

1:n (1:*)

Wenn keine referenzielle Einschränkung für die Zuordnung definiert ist, werden der Tabelle, die dem Entitätstyp am 0..1- oder *-Ende der Zuordnung entspricht, Spalten hinzugefügt. Die hinzugefügten Spalten besitzen Fremdschlüsseleinschränkungen, die auf den Primärschlüssel der Tabelle verweisen, die dem Entitätstyp am anderen Ende der Zuordnung entspricht. Die hinzugefügten Tabellenspalten werden der Zuordnung, nicht dem Entitätstyp zugeordnet. Der Name jeder hinzugefügten Spalte wird aus der Verkettung des Navigationseigenschaftennamens mit dem Namen der Schlüsseleigenschaft gebildet.

Wenn eine referenzielle Einschränkung für die Zuordnung im konzeptionellen Modell vorhanden ist, werden der Datenbanktabelle keine weiteren Spalten hinzugefügt. Stattdessen wird eine Fremdschlüsseleinschränkung erstellt. Die Einschränkung, die in der Datenbank erstellt wird, spiegelt die Einschränkung im konzeptionellen Modell wider: Spalten, die den abhängigen Eigenschaften im konzeptionellen Modell entsprechen, verweisen auf die Primärschlüsselspalten, die dem Entitätsschlüssel entsprechen. Der Name der Fremdschlüsseleinschränkung ist der Name der Zuordnung. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen und Bearbeiten referenzieller Einschränkungen (Entity Data Model-Tools).

1:1

Wenn keine referenzielle Einschränkung für die Zuordnung definiert ist, werden einer der Tabellen, die den Entitätstypen an den Enden der Zuordnung entsprechen, Spalten hinzugefügt. Die Tabelle, der die Spalten hinzugefügt werden, wird zufällig ausgewählt. Die hinzugefügten Spalten besitzen Fremdschlüsseleinschränkungen, die auf den Primärschlüssel der Tabelle verweisen, die dem Entitätstyp am anderen Ende der Zuordnung entspricht. Die hinzugefügten Spalten werden der Zuordnung, nicht dem Entitätstyp zugeordnet. Der Name jeder hinzugefügten Spalte wird aus der Verkettung des Navigationseigenschaftennamens mit dem Namen der Schlüsseleigenschaft gebildet.

Wenn eine referenzielle Einschränkung für die Zuordnung im konzeptionellen Modell vorhanden ist, werden der Datenbanktabelle keine weiteren Spalten hinzugefügt. Stattdessen wird eine Fremdschlüsseleinschränkung erstellt. Die Einschränkung, die in der Datenbank erstellt wird, spiegelt die Einschränkung im konzeptionellen Modell wider: Spalten, die den abhängigen Eigenschaften im konzeptionellen Modell entsprechen, verweisen auf die Primärschlüsselspalten, die dem Entitätsschlüssel entsprechen. Der Name der Fremdschlüsseleinschränkung ist der Name der Zuordnung. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen und Bearbeiten referenzieller Einschränkungen (Entity Data Model-Tools).

m:n (*:*)

Eine Jointabelle wird erstellt. Für jede Schlüsseleigenschaft in jedem Entitätstyp wird der Tabelle eine Spalte hinzugefügt. Die Spalten besitzen Fremdschlüsseleinschränkungen, die auf die Primärschlüssel in den Tabellen verweisen, die auf der Grundlage der Entitätstypen an den Enden der Zuordnung erstellt wurden. Der Primärschlüssel der erstellten Tabelle ist ein zusammengesetzter Primärschlüssel, der sich aus allen Spalten in der Tabelle zusammensetzt.

Der Name der erstellten Tabelle ist der gleiche wie der des AssociationSet-Elements.

Beispiel

Im folgenden Beispiel wird die DDL gezeigt, die für eine 1:*-Zuordnung generiert wurde. In diesem Modell gibt es eine 1:*-Zuordnung zwischen der Subject-Entität und der Course-Entität:

  • Subject-Entitätstyp (Entitätenmenge: SubjectSet):

    • SubjectID (Schlüsseleigenschaft, Int32)

    • DepartmentID (Schlüsseleigenschaft, Int32)

    • SubjectName (String)

  • Course-Entitätstyp (Entitätenmenge: CourseSet):

    • CourseID (Schlüsseleigenschaft, Int32)

    • SectionID (Schlüsseleigenschaft, Int32)

    • CourseName (String)

Code

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

Beispiel

Im folgenden Beispiel wird die DDL gezeigt, die für eine *:*-Zuordnung generiert wurde. In diesem Modell gibt es eine *:*-Zuordnung zwischen der Student-Entität und der Course-Entität:

  • Student-Entitätstyp (Entitätenmenge: StudentSet):

    • StudentID (Schlüsseleigenschaft, Int32)

    • LastName (String)

    • FirstName (String)

  • Course-Entitätstyp (Entitätenmenge: CourseSet):

    • CourseID (Schlüsseleigenschaft, Int32)

    • SectionID (Schlüsseleigenschaft, Int32)

    • CourseName (String)

Code

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

Beispiel

Im folgenden Beispiel wird die DDL gezeigt, die für eine 1:0..1 Zuordnung generiert wird, wenn eine referenzielle Einschränkung für die Zuordnung vorhanden ist. In diesem Modell ist InstructorId der Prinzipalschlüssel der referenziellen Einschränkung, und OfficeId ist der abhängige Schlüssel:

  • Instructor-Entitätstyp (Entitätenmenge: InstructorSet):

    • InstructorId (Schlüsseleigenschaft, Int32)

    • LastName (String)

    • FirstName (String)

  • Office-Entitätstyp (Entitätenmenge: OfficeSet):

    • OfficeID (Schlüsseleigenschaft, Int32)

    • Location (Schlüsseleigenschaft, String)

Code

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

Komplexe Typen und Spalten

Wenn ein Entitätstyp über eine ComplexType-Eigenschaft verfügt, wird der Tabelle, die auf der Grundlage des Entitätstyps erstellt wurde, eine Spalte für jede skalare Eigenschaft des ComplexType hinzugefügt. Der Name jeder Spalte wird aus der Verkettung des ComplexType-Eigenschaftennamens mit einem Unterstrich ("_") und dem Namen der entsprechenden Eigenschaft des ComplexType gebildet. Nehmen wir z. B. an, eine Entität verfügt über eine ComplexType-Eigenschaft mit dem Namen EntityProperty1, und der ComplexType besitzt die beiden skalaren Eigenschaften CTProperty1 und CTProperty2. Dann tragen die der Tabelle hinzugefügten Spalten die Namen EntityProperty1_CTProperty1 und EntityProperty1_CTProperty2.

Beispiel

Im folgenden Beispiel wird die DDL gezeigt, die für eine Entität mit einer ComplexType-Eigenschaft generiert wurde:

  • Instructor-Entitätstyp (Entitätenmenge: InstructorSet):

    • InstructorID (Schlüsseleigenschaft, Int32)

    • LastName (String)

    • FirstName (String)

    • ContactInfo (von ComplexType ContactInformation)

  • ContactInformation ComplexType:

    • HomePhone (String)

    • CellPhone (String)

    • EmailAddress (String)

Code

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

Facets und Datentypen

Facets stellen Datentypeinschränkungen für Entitätseigenschaften dar. Der Assistent zur Datenbankgenerierung geht mit Facets, die in der konzeptionellen Schemadefinitionssprache (CSDL) angegeben werden, wie folgt vor:

  • Die Facets werden aus den Property-Elementen in der CSDL in die entsprechenden Property-Elemente der Datenspeicherschema-Definitionssprache (SSDL) kopiert.

  • Die Facets werden in Anweisungen oder Einschränkungen in der DDL übersetzt:

    • Die Facets MaxLength, FixedLength, Precision, Scale und Unicode werden in Datentypmodifizierer für Spalten übersetzt.

    • Das Collation-Facet wird in eine COLLATE-Anweisung umgesetzt.

    • Wenn das StoreGeneratedPattern-Facet auf identity (StoreGeneratedPattern="identity") festgelegt wurde und der Eigenschaftentyp int, bigint, smallint, tinyint oder decimal ist, wird die betroffene Datenbankspalte mit der Spezifikation IDENTITY (1,1) erstellt. Weitere Informationen finden Sie unter Facets (CSDL) und Gewusst wie: Bearbeiten von Facetwerten (Entity Data Model-Tools).

Indizes

Gruppierte Indizes werden für die Primärschlüssel jeder Tabelle erstellt. Alle Indizes verwenden aufsteigende Reihenfolge.

DROP-Anweisungen

Wenn beim Ausführen des Assistenten zur Datenbankgenerierung bereits ein Speichermodell definiert ist, enthält die generierte DDL eine DROP TABLE-Anweisung und eine DROP CONSTRAINT-Anweisung für jedes vom Speichermodell abgeleitete EntitySet- bzw. AssociationSet-Element.

Siehe auch

Konzepte

ADO.NET Entity Data Model-Designer

Weitere Ressourcen

Assistent zur Datenbankgenerierung (Entity Data Model-Tools)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications