Правила создания базы данных (мастер создания базы данных)
Мастер создания базы данных создает схему базы данных из концептуальной модели с использованием сопоставления «одна таблица на тип». Стратегия сопоставления «одна таблица на тип» сопоставляет все неунаследованные свойства всех типов сущностей с отдельными таблицами в базе данных. В этом разделе описаны правила, применяемые при создании схемы базы данных.
Дополнительные сведения см. в разделах Как создать базу данных из концептуальной модели (средства работы с моделью EDM) и Как настроить создание базы данных (мастер создания базы данных).
Типы сущностей и таблицы
В следующей таблице описано создание таблиц на основе типов сущностей:
Имя таблицы |
Созданные столбцы1 |
Первичный ключ |
Внешние ключи |
|
Непроизводный тип |
Имя элемента EntitySet этого типа. |
Столбец для каждого из скалярных свойств, в том числе на каждое скалярное свойство свойств сложного типа. |
Столбец или столбцы, соответствующие свойству или свойствам ключа сущности. |
См. подраздел «Сопоставления и внешние ключи» далее. |
Производный тип |
Объединение имени элемента EntitySet базового типа и имени базового типа. |
Столбец для каждого из неунаследованных скалярных свойств (в том числе скалярных свойств сложного типа) и столбец для каждого из унаследованных ключевых свойств. |
Столбец или столбцы, соответствующие унаследованному свойству или свойствам ключа сущности. |
Первичный ключ дочерней таблицы является также внешним ключом, ссылающимся на первичный ключ родительской таблицы. Могут быть созданы дополнительные внешние ключи. Дополнительные сведения см. в разделе «Сопоставления и внешние ключи» ниже. |
- Для свойств навигации могут быть добавлены дополнительные столбцы. Дополнительные сведения см. в разделе «Сопоставления и внешние ключи» ниже в этом разделе.
Пример
Следующий пример иллюстрирует язык описания данных ( DDL), сформированный для модели со следующим описанием:
Тип сущности Person (набор сущностей: PersonSet):
Тип сущности Instructor (наследуется от Person, унаследованные свойства не перечислены):
DepartmentID (Int32)
OfficeLocation (String)
Код
-- --------------------------------------------------
-- 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
Сопоставления и внешние ключи
В этой таблице приведены правила создания кода DDL для сопоставлений. Обратите внимание, что для всех сопоставлений создается ограничение внешнего ключа.
Тип сопоставления | Правило создания внешнего ключа |
---|---|
Один к нулю или один к одному (1:0..1) — или — Один ко многим (1:*) |
Если для сопоставления не задано справочное ограничение, то столбцы добавляются к таблице, соответствующей типу сущности, на конце сопоставления 0..1 или *. Добавленные столбцы имеют ограничения внешнего ключа, которые ссылаются на первичный ключ таблицы, соответствующей типу сущности в другом элементе сопоставления. Добавленные столбцы таблицы сопоставляются с ассоциацией, а не с типом сущности. Имя каждого добавленного столбца представляет результат объединения имени свойства навигации и имени ключевого свойства. Если для сопоставления в концептуальной модели существует справочное ограничение, то в таблицу базы данных не добавляются дополнительные столбцы. Вместо этого создается ограничение внешнего ключа. Ограничение, созданное в базе данных, отражает ограничение в концептуальной модели: столбцы, соответствующие зависимым свойствам в концептуальной модели, ссылаются на столбцы первичного ключа, соответствующие ключу сущности. Именем ограничения внешнего ключа является имя сопоставления. Дополнительные сведения см. в разделе Как добавлять и изменять справочные ограничения (средства работы с моделью EDM). |
Один к одному (1:1) |
Если для сопоставления не задано справочное ограничение, то столбцы добавляются в одну из таблиц, соответствующих типам сущности, на концах сопоставления. Таблица, к которой добавляются столбцы, выбирается произвольно. Добавленные столбцы имеют ограничения внешнего ключа, которые ссылаются на первичный ключ таблицы, соответствующей типу сущности в другом элементе сопоставления. Добавленные столбцы сопоставляются с ассоциацией, а не с типом сущности. Имя каждого добавленного столбца представляет результат объединения имени свойства навигации и имени ключевого свойства. Если для сопоставления в концептуальной модели существует справочное ограничение, то в таблицу базы данных не добавляются дополнительные столбцы. Вместо этого создается ограничение внешнего ключа. Ограничение, созданное в базе данных, отражает ограничение в концептуальной модели: столбцы, соответствующие зависимым свойствам в концептуальной модели, ссылаются на столбцы первичного ключа, соответствующие ключу сущности. Именем ограничения внешнего ключа является имя сопоставления. Дополнительные сведения см. в разделе Как добавлять и изменять справочные ограничения (средства работы с моделью EDM). |
Многие ко многим (*:*) |
Создается таблица соединения. Для каждого ключевого свойства в каждом типе сущности к таблице добавляется столбец. Эти столбцы имеют ограничения внешнего ключа, которые ссылаются на первичные ключи таблиц, созданных на основе типов сущностей в концах сопоставления. Первичный ключ созданной таблицы будет составным первичным ключом, состоящим из всех столбцов таблицы. Имя созданной таблицы совпадает с именем элемента AssociationSet. |
Пример
В следующем примере показан код DDL, сформированный для сопоставления 1:*. В этой модели между сущностями Subject и Course имеется сопоставление 1:*.
Тип сущности Subject (набор сущностей: SubjectSet):
SubjectID (ключевое свойство, Int32)
DepartmentID (ключевое свойство, Int32)
SubjectName (String)
Тип сущности Course (набор сущностей: CourseSet):
CourseID (ключевое свойство, Int32)
SectionID (ключевое свойство, Int32)
CourseName (String)
Код
-- --------------------------------------------------
-- 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
Пример
В следующем примере показан код DDL, сформированный для сопоставления *:*. В этой модели между сущностями Student и Course имеется сопоставление *:*.
Тип сущности Student (набор сущностей: StudentSet)
StudentID (ключевое свойство, Int32)
LastName (String)
FirstName (String)
Тип сущности Course (набор сущностей: CourseSet):
CourseID (ключевое свойство, Int32)
SectionID (ключевое свойство, Int32)
CourseName (String)
Код
-- --------------------------------------------------
-- 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
Пример
В следующем примере иллюстрируется язык DDL, созданный для сопоставления 1:0..1, для которой задано справочное ограничение. В этой модели InstructorId является главным ключом справочного ограничения, а OfficeId — зависимым:
Тип сущности Instructor (набор сущностей: InstructorSet):
InstructorId (ключевое свойство, Int32)
LastName (String)
FirstName (String)
Тип сущности Office (набор сущностей: OfficeSet):
OfficeID (ключевое свойство, Int32)
Location (ключевое свойство, String)
Код
-- --------------------------------------------------
-- 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
Сложные типы и столбцы
Если тип сущности имеет свойство ComplexType, то к таблице, созданной на его основе, добавляется столбец для каждого скалярного свойства типа ComplexType. Имя каждого столбца представляет собой результат объединения имени свойства ComplexType, символа подчеркивания («_») и имени соответствующего свойства ComplexType. Например, сущность имеет свойство типа ComplexType с именем EntityProperty1, а ComplexType — два скалярных свойства, CTProperty1 и CTProperty2. В таблицу будут добавлены столбцы EntityProperty1_CTProperty1 и EntityProperty1_CTProperty2.
Пример
В следующем примере показаны конструкции языка DDL, созданные для сущности со свойством ComplexType:
Тип сущности Instructor (набор сущностей: InstructorSet):
InstructorID (ключевое свойство, Int32)
LastName (String)
FirstName (String)
ContactInfo (принадлежит к типу ComplexType ContactInformation)
ContactInformation ComplexType:
HomePhone (String)
CellPhone (String)
EmailAddress (String)
Код
-- --------------------------------------------------
-- 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
Аспекты и типы данных
Аспекты представляют собой ограничения типов данных в свойствах сущностей. Мастер создания баз данных выполняет следующие операции с аспектами, определенными в языке определения концептуальных схем (CSDL):
Копирует аспекты из элементов Property языка CSDL в соответствующие элементы Property в языке определений схемы хранения (SSDL).
Преобразует аспекты в операторы или ограничения языка DDL:
Аспекты MaxLength, FixedLength, Precision, Scale и Unicode преобразуются в модификаторы типов данных, принадлежащие столбцам.
Аспект Collation преобразуется в оператор COLLATE.
Если для аспекта StoreGeneratedPattern задано значение identity (
StoreGeneratedPattern="identity"
), а свойство имеет тип int, bigint, smallint, tinyint или decimal, то соответствующий столбец базы данных будет создан со спецификацией IDENTITY(1,1). Дополнительные сведения см. в разделах Facets (CSDL) и Как изменить значения аспектов (средства работы с моделью EDM).
Indexes
На первичных ключах всех таблиц создаются кластеризованные индексы. Все индексы располагаются по возрастанию.
DROP-инструкции
Если модель хранения уже определена на момент запуска мастера создания базы данных, то сформированный код DDL будет содержать инструкции DROP TABLE и DROP CONSTRAINT для каждого EntitySet и AssociationSet соответственно, которые получены из модели хранения.
См. также
Основные понятия
Конструктор моделей EDM ADO.NET
Другие ресурсы
Мастер создания базы данных (средства работы с моделью EDM)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications