데이터베이스 생성 규칙(데이터베이스 생성 마법사)

데이터베이스 만들기 마법사는 형식당 하나의 테이블 매핑 전략을 사용하여 개념적 모델에서 데이터베이스 스키마를 생성합니다. 형식당 하나의 테이블 매핑 전략은 각 엔터티 형식에 대해 상속되지 않는 모든 속성이 별도의 데이터베이스 테이블에 매핑되는 매핑 전략입니다. 이 항목에서는 데이터베이스 스키마를 생성하는 데 사용되는 규칙을 설명합니다.

자세한 내용은 방법: 개념적 모델에서 데이터베이스 생성(엔터티 데이터 모델 도구)방법: 데이터베이스 생성 사용자 지정(데이터베이스 생성 마법사)을 참조하십시오.

엔터티 형식 및 테이블

다음 표에서는 엔터티 형식을 기반으로 테이블이 만들어지는 방식에 대해 설명합니다.

테이블 이름

만들어진 열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 또는 * 끝에서 엔터티 형식에 해당하는 테이블에 열이 추가됩니다. 추가된 열에는 연결의 다른 쪽 끝에서 엔터티 형식에 해당하는 테이블의 기본 키를 참조하는 외래 키 제약 조건이 있습니다. 추가된 테이블 열은 엔터티 형식이 아니라 연결에 매핑됩니다. 추가된 각 열의 이름은 탐색 속성 이름과 키 속성 이름을 연결하여 지정됩니다.

개념적 모델에서 연결에 참조 제약 조건이 있으면 데이터베이스 테이블에 다른 열이 추가되지 않습니다. 대신 외래 키 제약 조건이 만들어집니다. 데이터베이스에 만들어지는 제약 조건은 개념적 모델의 제약 조건을 미러링합니다. 즉, 개념적 모델에서 종속 속성에 해당하는 열은 엔터티 키에 해당하는 기본 키 열을 참조합니다. 외래 키 제약 조건의 이름은 연결의 이름입니다. 자세한 내용은 방법: 참조 제약 조건 추가 및 편집(엔터티 데이터 모델 도구)를 참조하십시오.

일대일(1:1)

연결에 참조 제약 조건이 정의되지 않으면 연결의 양쪽 끝에서 엔터티 형식에 해당하는 테이블 중 하나에 열이 추가됩니다. 열이 추가되는 테이블은 임의로 선택됩니다. 추가된 열에는 연결의 다른 쪽 끝에서 엔터티 형식에 해당하는 테이블의 기본 키를 참조하는 외래 키 제약 조건이 있습니다. 추가된 열은 엔터티 형식이 아니라 연결에 매핑됩니다. 추가된 각 열의 이름은 탐색 속성 이름과 키 속성 이름을 연결하여 지정됩니다.

개념적 모델에서 연결에 참조 제약 조건이 있으면 데이터베이스 테이블에 다른 열이 추가되지 않습니다. 대신 외래 키 제약 조건이 만들어집니다. 데이터베이스에 만들어지는 제약 조건은 개념적 모델의 제약 조건을 미러링합니다. 즉, 개념적 모델에서 종속 속성에 해당하는 열은 엔터티 키에 해당하는 기본 키 열을 참조합니다. 외래 키 제약 조건의 이름은 연결의 이름입니다. 자세한 내용은 방법: 참조 제약 조건 추가 및 편집(엔터티 데이터 모델 도구)를 참조하십시오.

다대다(*:*)

조인 테이블이 만들어집니다. 각 엔터티 형식의 각 키 속성에 대해 테이블에 열이 추가됩니다. 열에는 연결의 양쪽 끝에서 엔터티 형식을 기반으로 만들어지는 테이블의 기본 키를 참조하는 외래 키 제약 조건이 있습니다. 만들어진 테이블의 기본 키는 테이블의 모든 열로 구성되는 복합 기본 키가 됩니다.

만들어진 테이블의 이름은 AssociationSet 요소 이름과 같습니다.

예제

다음 예제에서는 1:* 연결에 대해 생성되는 DDL을 보여 줍니다. 이 모델의 경우 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

예제

다음 예제에서는 참조 제약 조건이 연결에 있는 경우 1:0..1 연결에 대해 생성되는 DDL을 보여 줍니다. 이 모델의 경우 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의 해당 속성 이름을 연결하여 지정됩니다. 예를 들어 엔터티에 이름이 EntityProperty1인 ComplexType 속성이 있고 ComplexType에 CTProperty1과 CTProperty2라는 두 개의 스칼라 속성이 있는 경우를 가정해 봅니다. 테이블에 추가되는 열은 EntityProperty1_CTProperty1과 EntityProperty1_CTProperty2입니다.

예제

다음 예제에서는 ComplexType 속성이 있는 엔터티에 대해 생성되는 DDL을 보여 줍니다.

  • 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(개념 스키마 정의 언어)에 지정된 패싯을 사용하여 다음을 수행합니다.

  • CSDL에서 Property 요소의 패싯을 SSDL(저장소 스키마 정의 언어)의 해당 Property 요소에 복사합니다.

  • 패싯을 다음과 같이 DDL의 문 또는 제약 조건으로 변환합니다.

    • MaxLength, FixedLength, Precision, ScaleUnicode 패싯은 열에 대한 데이터 형식 한정자로 변환됩니다.

    • Collation 패싯은 COLLATE 문으로 변환됩니다.

    • StoreGeneratedPattern 패싯이 identity(StoreGeneratedPattern="identity")로 설정되고 속성 형식이 int, bigint, smallint, tinyint 또는 decimal인 경우, IDENTITY(1,1) 사양을 사용하여 영향을 받는 데이터베이스 열이 만들어집니다. 자세한 내용은 Facets (CSDL)방법: 패싯 값 편집(엔터티 데이터 모델 도구)을 참조하십시오.

인덱스

각 테이블의 기본 키에 클러스터형 인덱스가 만들어집니다. 모든 인덱스는 오름차순으로 정렬됩니다.

DROP 문

데이터베이스 만들기 마법사를 실행할 때 저장소 모델이 이미 정의되어 있는 경우 생성된 DDL은 저장소 모델에서 유추된 각 EntitySet과 각 AssociationSet에 대해 각각 DROP TABLE 문과 DROP CONSTRAINT 문을 포함합니다.

참고 항목

개념

ADO.NET 엔터티 데이터 모델 디자이너

기타 리소스

데이터베이스 생성 마법사(엔터티 데이터 모델 도구)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications