SQL Server 中的连接表

Posted

技术标签:

【中文标题】SQL Server 中的连接表【英文标题】:Junction Table in SQL Server 【发布时间】:2013-04-01 20:37:06 【问题描述】:

我在新数据库中创建联结表时遇到困难。我使用这些查询来创建表:

CREATE TABLE dbo.EmployeeUnavailability 
(
 ID INT IDENTITY(1,1) PRIMARY KEY,
 EmployeeName varchar(50),
 Monday varchar(10),
 Tuesday varchar(10),
 Wednesday varchar(10),
 Thursday varchar(10),
 Friday varchar(10),
 Saturday varchar(10),
 Sunday varchar(10),
 SupervisorName varchar(50),
)
GO 

CREATE TABLE dbo.EmployeeAttendance
(
 ID INT IDENTITY(1,1) PRIMARY KEY,
 EmployeeName varchar(50),
 Monday varchar(20),
 Tuesday varchar(20),
 Wednesday varchar(20),
 Thursday varchar(20),
 Friday varchar(20),
 Saturday varchar(20),
 Sunday varchar(20),
 SupervisorName varchar(50),
)
GO 

CREATE TABLE dbo.EmployeePerformance 
(
 ID INT IDENTITY(1,1) PRIMARY KEY,
 EmployeeName varchar(50),
 Attitude varchar(250),
 AttitudeDD tinyint,
 WorkQuality varchar(250),
 WorkQualityDD tinyint,
 Communication varchar(250),
 CommunicationDD tinyint,
 Leadership varchar(250),
 LeadershipDD tinyint,
 ImprovementAchievement varchar(250),
 ImprovementAchievementDD tinyint,
 SupervisorName varchar(50),
)
GO 

从那里,我很难创建一个将引用所有三个表的联结表。三个表中的员工姓名和主管姓名将相同。

【问题讨论】:

员工是您域中的实体。因此,您肯定应该有一个 Employee 表。在这种情况下,员工的姓名将在 Employee 表中,您不必多次重复。看看 dbo.EmployeeUnavailability。该表中的一行说明了什么?星期一的专栏是什么意思?好的,我们说的是哪一周?重命名您的列以更清晰。 抱歉,您需要回归基础。您没有一周中的每一天的列。 如果我们添加年份信息和那一年的周数,可以有这样的列。这样我们就能够准确地识别我们正在捕获信息的日期。但我不建议这种设计。这太复杂了。 【参考方案1】:

拥有一个引用所有 3 个表的表在 IMO 中并不是一个好主意。它将允许该联结表中的行可以引用其他表中没有任何共同点的行。 IE。联结表中的一行可以引用第一个表中的 John、第二个表中的 Mary 和第三个表中的 Garry 的行。

创建一个仅包含来自 Employee 实体的属性的 Employee 表。添加 EmployeeUnavailability,它将具有它的 ID,指向 Employee 中的一行并使用 datetime 类型的列标识日期。

员工出勤与员工绩效无关。一名员工可以很少展示,但却是一名绩效忍者。

【讨论】:

以上是关于SQL Server 中的连接表的主要内容,如果未能解决你的问题,请参考以下文章

sql server 表连接

如何解决sqlserver2005中用多表连接的结果建一张新表时,提示各表中的列名必须唯一的问题?

全面解析SQL SERVER 的左右内连接

带有 TIMESTAMP 的 SQL Server 中的表连接问题

SQL Server中常用的SQL语句(转):

sql server中怎么给数据库表中的用户密码加密