資料庫產生規則 (產生資料庫精靈)
建立資料庫精靈會使用一類一表 (Table-Per-Type) 對應策略從概念模型產生資料庫結構描述。 一類一表 (Table-Per-Type) 對應策略是一種對應策略,這種策略會將每一個實體類型上的所有非繼承屬性對應到個別的資料庫資料表。 本主題描述用於產生資料庫結構描述的規則。
如需詳細資訊,請參閱 HOW TO:從概念模型產生資料庫 (實體資料模型工具)和 HOW TO:自訂資料庫產生 (產生資料庫精靈)。
實體類型和資料表
下表描述如何依據實體類型建立資料表:
資料表名稱 |
建立的資料行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 或 * 端實體類型的資料表。 所加入的資料行具有外部索引鍵條件約束,這些條件約束參考對應到此關聯另一端上實體類型的資料表主索鍵。 所加入的資料表資料行是對應到此關聯,而非實體類型。 加入的每一個資料行的名稱就是導覽屬性名稱和索引鍵屬性名稱的串連。 如果概念模型中的關聯上有參考條件約束,就不會有額外資料行加入到資料庫資料表, 但是會建立外部索引鍵條件約束。 建立在資料庫中的條件約束會映射概念模型中的條件約束:對應到概念模型中相依屬性的資料行會參考對應到實體索引鍵的主索引鍵資料行。 外部索引鍵條件約束的名稱就是此關聯的名稱。 如需詳細資訊,請參閱 HOW TO:加入和編輯參考條件約束 (實體資料模型工具)。 |
一對一 (1:1) |
如果關聯上未定義參考條件約束,就會將資料行加入對應到此關聯各端上實體類型的其中一個資料表。 資料行要加入的資料表是任意選擇的。 所加入的資料行具有外部索引鍵條件約束,這些條件約束參考對應到此關聯另一端上實體類型的資料表主索鍵。 所加入的資料行是對應到此關聯,而非實體類型。 加入的每一個資料行的名稱就是導覽屬性名稱和索引鍵屬性名稱的串連。 如果概念模型中的關聯上有參考條件約束,就不會有額外資料行加入到資料庫資料表, 但是會建立外部索引鍵條件約束。 建立在資料庫中的條件約束會映射概念模型中的條件約束:對應到概念模型中相依屬性的資料行會參考對應到實體索引鍵的主索引鍵資料行。 外部索引鍵條件約束的名稱就是此關聯的名稱。 如需詳細資訊,請參閱 HOW TO:加入和編輯參考條件約束 (實體資料模型工具)。 |
多對多 (*:*) |
將會建立聯結資料表。 針對每一個實體類型中的每一個索引鍵屬性,加入一個資料行到此資料表。 這些資料行具有外部索引鍵條件約束,這些條件約束參考依據此關聯各端上實體類型建立的資料表中的主索引鍵。 所建立的資料表的主索引鍵將會是由資料表中所有資料行構成的複合主索引鍵。 所建立的資料表的名稱與 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
Facet 和資料型別
Facet 表示實體屬性上的資料型別條件約束。 產生資料庫精靈會對概念結構定義語言 (CSDL) 中指定的 Facet 執行下列動作:
從 CSDL 中的 Property 項目將 Facet 複製到存放結構定義語言 (SSDL) 中的對應 Property 項目。
將 Facet 轉譯為 DDL 中的陳述式或條入約束:
MaxLength、FixedLength、Precision、Scale 和 Unicode Facet 會轉譯為資料行上的資料型別修飾詞。
Collation Facet 則轉譯為 COLLATE 陳述式。
如果 StoreGeneratedPattern Facet 是設定為 identity (
StoreGeneratedPattern="identity"
) 而且屬性型別為 int、bigint、smallint、tinyint 或 decimal,則受影響的資料庫資料行將會以 IDENTITY(1,1) 規格建立。 如需詳細資訊,請參閱 Facets (CSDL) 和 HOW TO:編輯 Facet 值 (實體資料模型工具)。
索引
每一個資料表的主索引鍵上會建立叢集索引。 所有索引都是遞增順序。
DROP 陳述式
如果執行 [建立資料庫精靈] 時,已經定義儲存模型,則產生的 DDL 會針對從每個儲存模型推斷的 EntitySet 和每個 AssociationSet,分別納入 DROP TABLE 陳述式和 DROP CONSTRAINT 陳述式。
另請參閱
概念
其他資源
產生資料庫精靈 (Entity Data Model Tool)
EntitySet Element (EntityContainer CSDL)
CSDL, SSDL, and MSL Specifications