Règles de génération des bases de données (Assistant Génération de la base de données)
L'Assistant Création d'une base de données génère un schéma de la base de données à partir d'un modèle conceptuel à l'aide d'une stratégie de mappage table par type. Une stratégie de mappage table par type est une stratégie dans laquelle toutes les propriétés non héritées sur chaque type d'entité sont mappées à des tables de bases de données distinctes. Cette rubrique décrit les règles utilisées pour générer le schéma de la base de données.
Pour plus d'informations, consultez Procédure : générer une base de données à partir d'un modèle conceptuel (Entity Data Model Tools) et Procédure : personnaliser la génération de la base de données (Assistant Génération de la base de données).
Types d'entité et tables
Le tableau suivant décrit le mode de création des tables à partir des types d'entité :
Nom de la table |
Colonnes1 créées |
Clé primaire |
Clés étrangères |
|
Type non dérivé |
Nom de l'élément EntitySet du type. |
Une colonne pour chaque propriété scalaire, notamment chaque propriété scalaire de propriétés de type complexe. |
Colonne ou colonnes qui correspondent à la propriété ou aux propriétés de clé d'entité. |
Consultez la section Associations et clés étrangères ci-dessous. |
Type dérivé |
Concaténation du nom d'élément EntitySet du type de base et le nom de type. |
Colonne pour chaque propriété scalaire non héritée (notamment chaque propriété scalaire de propriétés de type complexe) et une colonne pour chaque propriété de clé héritée. |
Colonne ou colonnes qui correspondent à la propriété ou aux propriétés de clé d'entité héritées. |
La clé primaire de la table enfant est également une clé étrangère qui référence la clé primaire de sa table parente. Des clés étrangères supplémentaires peuvent être créées. Pour plus d'informations, consultez la section Associations et clés étrangères ci-dessous. |
- Des colonnes supplémentaires peuvent être ajoutées pour les propriétés de navigation. Pour plus d'informations, consultez la section Associations et clés étrangères, plus loin dans cette rubrique.
Exemple
L'exemple suivant affiche le langage de description de données (DDL) généré pour un modèle avec la description suivante :
Le type d'entité Person (jeu d'entités : PersonSet) :
Le type d'entité Instructor (hérite de Person ; les propriétés héritées n'apparaissent pas) :
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
Associations et clés étrangères
Le tableau suivant décrit les règles de génération DDL pour les associations. Notez que pour toutes les associations, une contrainte de clé étrangère est créée.
Type d'association | Règle de génération de la clé étrangère |
---|---|
Un-à-zéro-ou-un (1:0..1) ou Un-à-plusieurs (1:*) |
Si aucune contrainte référentielle n'est définie sur l'association, des colonnes sont ajoutées à la table qui correspond au type d'entité sur la terminaison d'association 0..1 ou *. Les colonnes ajoutées ont des contraintes de clé étrangère qui référencent la clé primaire de la table qui correspond au type d'entité sur l'autre terminaison d'association. Les colonnes de table ajoutées sont mappées à l'association, pas le type d'entité. Le nom de chaque colonne ajoutée est la concaténation du nom de la propriété de navigation et du nom de la propriété de clé. Si une contrainte référentielle existe sur l'association dans le modèle conceptuel, aucune colonne supplémentaire n'est ajoutée à la table de base de données. Au lieu de cela, une contrainte de clé étrangère est créée. La contrainte créée dans la base de données reflète la contrainte dans le modèle conceptuel : colonnes qui correspondent aux propriétés dépendantes dans le modèle conceptuel référence les colonnes de clé primaire qui correspondent à la clé d'entité. Le nom de la contrainte de clé étrangère correspond au nom de l'association. Pour plus d'informations, consultez Procédure : ajouter et modifier des contraintes référentielles (Entity Data Model Tools). |
Un-à-un (1:1) |
Si aucune contrainte référentielle n'est définie sur l'association, des colonnes sont ajoutées à l'une des tables qui correspondent aux types d'entité sur les terminaisons d'association. La table à laquelle les colonnes sont ajoutées est sélectionnée arbitrairement. Les colonnes ajoutées ont des contraintes de clé étrangère qui référencent la clé primaire de la table qui correspond au type d'entité sur l'autre terminaison d'association. Les colonnes ajoutées sont mappées à l'association, pas le type d'entité. Le nom de chaque colonne ajoutée est la concaténation du nom de la propriété de navigation et du nom de la propriété de clé. Si une contrainte référentielle existe sur l'association dans le modèle conceptuel, aucune colonne supplémentaire n'est ajoutée à la table de base de données. Au lieu de cela, une contrainte de clé étrangère est créée. La contrainte créée dans la base de données reflète la contrainte dans le modèle conceptuel : colonnes qui correspondent aux propriétés dépendantes dans le modèle conceptuel référence les colonnes de clé primaire qui correspondent à la clé d'entité. Le nom de la contrainte de clé étrangère correspond au nom de l'association. Pour plus d'informations, consultez Procédure : ajouter et modifier des contraintes référentielles (Entity Data Model Tools). |
Plusieurs à plusieurs (*:*) |
Une table de jointures est créée. Pour chaque propriété de clé dans chaque type d'entité, une colonne est ajoutée à la table. Les colonnes ont des contraintes de clé étrangère qui référencent les clés primaires dans les tables créées à partir des types d'entité sur les terminaisons d'association. La clé primaire de la table créée sera une clé primaire composée qui comprend toutes les colonnes de la table. Le nom de la table créée est identique au nom d'élément AssociationSet. |
Exemple
L'exemple suivant affiche le DDL généré pour une association 1: *. Dans ce modèle, une association 1: * est définie entre l'entité Objet et l'entité Cours :
Le type d'entité Objet (jeu d'entités : SubjectSet) :
SubjectID (propriété de clé, Int32)
DepartmentID (propriété de clé, Int32)
SubjectName (String)
Le type d'entité Cours (jeu d'entités : CourseSet) :
CourseID (propriété de clé, Int32)
SectionID (propriété de clé, 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
Exemple
L'exemple suivant affiche le DDL généré pour une association *:*. Dans ce modèle, une association *:* est définie entre l'entité Étudiant et l'entité Cours :
Le type d'entité Étudiant (jeu d'entités : StudentSet) :
StudentID (propriété de clé, Int32)
LastName (String)
FirstName (String)
Le type d'entité Cours (jeu d'entités : CourseSet) :
CourseID (propriété de clé, Int32)
SectionID (propriété de clé, 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
Exemple
L'exemple suivant affiche le DDL généré pour une association 1:0..1 lorsqu'une contrainte référentielle existe sur l'association. Dans ce modèle, InstructorId est la clé principale de la contrainte référentielle et OfficeId est la clé dépendante :
Le type d'entité Formateur (jeu d'entités : InstructorSet) :
InstructorId (propriété de clé, Int32)
LastName (String)
FirstName (String)
Le type d'entité Bureau (jeu d'entités : OfficeSet) :
OfficeID (propriété de clé, Int32)
Emplacement (propriété de clé, 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
Types complexes et colonnes
Si un type d'entité a une propriété ComplexType, une colonne pour chaque propriété scalaire du ComplexType est ajoutée à la table créée à partir du type d'entité. Le nom de chaque colonne est la concaténation du nom de propriété ComplexType, un trait de soulignement (« _ ») et le nom de la propriété correspondante du ComplexType. Par exemple, supposez qu'une entité ait une propriété ComplexType avec le nom EntityProperty1, et le ComplexType a deux propriétés scalaires, CTProperty1 et CTProperty2. Les colonnes ajoutées à la table sont EntityProperty1_CTProperty1 et EntityProperty1_CTProperty2.
Exemple
L'exemple suivant affiche le DDL généré pour une entité avec une propriété ComplexType :
Le type d'entité Formateur (jeu d'entités: InstructorSet) :
InstructorId (propriété de clé, Int32)
LastName (String)
FirstName (String)
ContactInfo (de 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
Facettes et types de données
Les facettes représentent des contraintes de type de données sur les propriétés d'entités. L'Assistant Génération de la base de données effectue les opérations suivantes avec les facettes spécifiées en langage de définition de schéma conceptuel (CSDL) :
Copie les facettes d'éléments Property dans le CSDL vers les éléments Property correspondants au format SSDL (Store Schema Definition Language).
Convertit les facettes en instructions ou contraintes dans le DDL :
Les facettes MaxLength, FixedLength, Precision, Scale et Unicode sont converties en modificateurs de type de données sur les colonnes.
La facette Collation est convertie en instruction COLLATE.
Si la facette StoreGeneratedPattern est définie sur identity (
StoreGeneratedPattern="identity"
) et le type de propriété est int, bigint, smallint, tinyintou decimal, la colonne de base de données affectée sera créée avec la spécification IDENTITY (1,1). Pour plus d'informations, consultez Facets (CSDL) et Procédure : modifier les valeurs de facettes (Entity Data Model Tools).
Index
Les index clusters sont créés sur les clés primaires pour chaque table. Tous les index sont dans l'ordre croissant.
Instructions DROP
Si un modèle de stockage est déjà défini lorsque vous exécutez l'Assistant Création d'une base de données, le DDL généré contient une instruction DROP TABLE et une instruction DROP CONSTRAINT pour chaque EntitySet et AssociationSet (respectivement) déduits du modèle de stockage.
Voir aussi
Concepts
ADO.NET Entity Data Model Designer
Autres ressources
Assistant Génération de la base de données (Entity Data Model Tools)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications