【发布时间】:2012-12-03 07:07:43
【问题描述】:
我对架构的设计有点困惑,但在开始之前,让我先向您展示架构,
CREATE TABLE Person
(
PersonID INT NOT NULL PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
-- some columns here..
CONSTRAINT tb_idF INDEX (FirstName),
CONSTRAINT tb_idL INDEX (LastName)
-- or
-- CONSTRAINT tb_idL INDEX (FirstName, LastName)
-- other constraints ...
);
CREATE TABLE JobDescription
(
JobDescriptionID INT NOT NULL PRIMARY KEY,
JobDescriptionName VARCHAR(50) UNIQUE
-- some columns here..
-- constraints ...
);
混乱就在这里,映射表:Person 和JobDescription。目前,我有这个设计,
CREATE TABLE Person_JobDescription
(
RECID INT AUTO_INCREMENT PRIMARY KEY, -- for some special reasons
-- I need to map to other table
PersonID INT,
JobDescriptionID INT,
StartYear INT, -- year JobDescription was Appointed
EndYear INT,
CONSTRAINT tb_fk1 FOREIGN KEY (PersonID)
REFERENCES Person(PersonID),
CONSTRAINT tb_fk2 FOREIGN KEY (JobDescriptionID)
REFERENCES JobDescription(JobDescriptionID),
CONSTRAINT tb_uq UNIQUE (PersonID, JobDescriptionID)
);
但我有另一个想法,映射表的结构会是这样的
CREATE TABLE Person_JobDescription
(
PersonID INT, -- map these two columns on the other table
JobDescriptionID INT, -- ^^
StartYear INT, -- year JobDescription was Appointed
EndYear INT,
CONSTRAINT tb_fk1 FOREIGN KEY (PersonID)
REFERENCES Person(PersonID),
CONSTRAINT tb_fk2 FOREIGN KEY (JobDescriptionID)
REFERENCES JobDescription(JobDescriptionID),
CONSTRAINT tb_pk PRIMARY KEY (PersonID, JobDescriptionID)
);
当我针对上面的表创建和测试查询时,它们都返回相同的结果,并且性能也与我在小型数据库上测试的相同(有 50k 条记录)。我想知道这两个查询在大型数据库上的表现如何。
问题
- 在大型数据库上您更喜欢映射表 (
Person_JobDescription) 的两种模式中的哪一种?
按照指示,我不能在FirstName 和LastName 上创建UNIQUE 约束。但我已经为这两列提供了一个索引。
- 我将在表
Person上使用什么类型的索引?每列的索引或FirstName和LastName的复合索引? - 我什么时候会使用单索引
INDEX (Col1)和INDEX (Col2)而不是INDEX (Col1, Col2)?
感谢您花时间阅读这个问题。
最好的问候,
德里克·弗洛斯
【问题讨论】: