Правила создания базы данных (мастер создания базы данных)

Мастер создания базы данных создает схему базы данных из концептуальной модели с использованием сопоставления «одна таблица на тип». Стратегия сопоставления «одна таблица на тип» сопоставляет все неунаследованные свойства всех типов сущностей с отдельными таблицами в базе данных. В этом разделе описаны правила, применяемые при создании схемы базы данных.

Дополнительные сведения см. в разделах Как создать базу данных из концептуальной модели (средства работы с моделью EDM) и Как настроить создание базы данных (мастер создания базы данных).

Типы сущностей и таблицы

В следующей таблице описано создание таблиц на основе типов сущностей:

Имя таблицы

Созданные столбцы1

Первичный ключ

Внешние ключи

Непроизводный тип

Имя элемента EntitySet этого типа.

Столбец для каждого из скалярных свойств, в том числе на каждое скалярное свойство свойств сложного типа.

Столбец или столбцы, соответствующие свойству или свойствам ключа сущности.

См. подраздел «Сопоставления и внешние ключи» далее.

Производный тип

Объединение имени элемента EntitySet базового типа и имени базового типа.

Столбец для каждого из неунаследованных скалярных свойств (в том числе скалярных свойств сложного типа) и столбец для каждого из унаследованных ключевых свойств.

Столбец или столбцы, соответствующие унаследованному свойству или свойствам ключа сущности.

Первичный ключ дочерней таблицы является также внешним ключом, ссылающимся на первичный ключ родительской таблицы.

Могут быть созданы дополнительные внешние ключи. Дополнительные сведения см. в разделе «Сопоставления и внешние ключи» ниже.

  1. Для свойств навигации могут быть добавлены дополнительные столбцы. Дополнительные сведения см. в разделе «Сопоставления и внешние ключи» ниже в этом разделе.

Пример

Следующий пример иллюстрирует язык описания данных ( DDL), сформированный для модели со следующим описанием:

  • Тип сущности Person (набор сущностей: PersonSet):

    • PersonID (ключевое свойство, Int32)

    • LastName (String)

    • FirstName (String)

  • Тип сущности 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