2012-08-07 4 views
0

하나의 열에 외래 키로 여러 열에 관한 의심의 여지가있었습니다. 예를 들어 설명하겠습니다.하나의 열에 외래 키로 다른 테이블의 여러 열

예 :

Company1 : Company_ID(guid) as Primary key, Address (varchar(25))

Company2 : Company_ID(guid) as Primary key, Address (varchar(25))

직원 : 여기 Employee_ID(guid) as Primary key, Company_ID (Foreign key referencing from Company1 and Company2)

회사에 대한 외부 키를 내가 3 개 테이블이 Employee 테이블의 _ID는 두 개의 다른 테이블에서옵니다. 이것은 SQL 서버 2008에서 작동합니다.

제 질문은 어떻게 생각합니까? 필자는 어떤 시스템에서도이 작업을 한 적이 없지만 샘플에서이 작업을 시도하고있었습니다. 나는 그것이 완벽하게 작동하기 때문에 무언가가 잘못되었다고 스스로 설명 할 수는 없다.

제 가정은 정확합니까? 아니면 이것에 관해 안내해주십시오. 위의 관계에있는 결함은 무엇입니까?

USE [master] 
GO 
/****** Object: Database [Test] Script Date: 08/07/2012 14:32:32 ******/ 
CREATE DATABASE [Test] ON PRIMARY 
(NAME = N'Test', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.FLEXIQUOTE\MSSQL\DATA\Test.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB) 
LOG ON 
(NAME = N'Test_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.FLEXIQUOTE\MSSQL\DATA\Test_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) 
GO 
ALTER DATABASE [Test] SET COMPATIBILITY_LEVEL = 100 
GO 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
begin 
EXEC [Test].[dbo].[sp_fulltext_database] @action = 'enable' 
end 
GO 
ALTER DATABASE [Test] SET ANSI_NULL_DEFAULT OFF 
GO 
ALTER DATABASE [Test] SET ANSI_NULLS OFF 
GO 
ALTER DATABASE [Test] SET ANSI_PADDING OFF 
GO 
ALTER DATABASE [Test] SET ANSI_WARNINGS OFF 
GO 
ALTER DATABASE [Test] SET ARITHABORT OFF 
GO 
ALTER DATABASE [Test] SET AUTO_CLOSE OFF 
GO 
ALTER DATABASE [Test] SET AUTO_CREATE_STATISTICS ON 
GO 
ALTER DATABASE [Test] SET AUTO_SHRINK OFF 
GO 
ALTER DATABASE [Test] SET AUTO_UPDATE_STATISTICS ON 
GO 
ALTER DATABASE [Test] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO 
ALTER DATABASE [Test] SET CURSOR_DEFAULT GLOBAL 
GO 
ALTER DATABASE [Test] SET CONCAT_NULL_YIELDS_NULL OFF 
GO 
ALTER DATABASE [Test] SET NUMERIC_ROUNDABORT OFF 
GO 
ALTER DATABASE [Test] SET QUOTED_IDENTIFIER OFF 
GO 
ALTER DATABASE [Test] SET RECURSIVE_TRIGGERS OFF 
GO 
ALTER DATABASE [Test] SET DISABLE_BROKER 
GO 
ALTER DATABASE [Test] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO 
ALTER DATABASE [Test] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO 
ALTER DATABASE [Test] SET TRUSTWORTHY OFF 
GO 
ALTER DATABASE [Test] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO 
ALTER DATABASE [Test] SET PARAMETERIZATION SIMPLE 
GO 
ALTER DATABASE [Test] SET READ_COMMITTED_SNAPSHOT OFF 
GO 
ALTER DATABASE [Test] SET HONOR_BROKER_PRIORITY OFF 
GO 
ALTER DATABASE [Test] SET READ_WRITE 
GO 
ALTER DATABASE [Test] SET RECOVERY SIMPLE 
GO 
ALTER DATABASE [Test] SET MULTI_USER 
GO 
ALTER DATABASE [Test] SET PAGE_VERIFY CHECKSUM 
GO 
ALTER DATABASE [Test] SET DB_CHAINING OFF 
GO 
USE [Test] 
GO 
/****** Object: Table [dbo].[Table2] Script Date: 08/07/2012 14:32:32 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Table2](
    [Company2ID] [int] NOT NULL, 
    [COmpanyAddress] [nchar](10) NULL, 
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED 
(
    [Company2ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[Table1] Script Date: 08/07/2012 14:32:32 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Table1](
    [Company1ID] [int] NOT NULL, 
    [CompanyName] [nchar](10) NULL, 
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
    [Company1ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: Table [dbo].[Table3] Script Date: 08/07/2012 14:32:32 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Table3](
    [EMployeeID] [int] NOT NULL, 
    [Company] [int] NULL, 
CONSTRAINT [PK_Table3] PRIMARY KEY CLUSTERED 
(
    [EMployeeID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
/****** Object: ForeignKey [FK_Table3_Table1] Script Date: 08/07/2012 14:32:32 ******/ 
ALTER TABLE [dbo].[Table3] WITH CHECK ADD CONSTRAINT [FK_Table3_Table1] FOREIGN KEY([Company]) 
REFERENCES [dbo].[Table1] ([Company1ID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE 
GO 
ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table1] 
GO 
/****** Object: ForeignKey [FK_Table3_Table2] Script Date: 08/07/2012 14:32:32 ******/ 
ALTER TABLE [dbo].[Table3] WITH CHECK ADD CONSTRAINT [FK_Table3_Table2] FOREIGN KEY([Company]) 
REFERENCES [dbo].[Table2] ([Company2ID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE 
GO 
ALTER TABLE [dbo].[Table3] CHECK CONSTRAINT [FK_Table3_Table2] 
GO 
+2

글쎄, 첫 번째 질문은 왜 2 개의 회사 테이블일까요? –

+0

나는 진짜 시나리오를 설명 할 수 없기 때문에이 간단한 예를 들었다. 말하자면, 일부 레거시 시스템에서 이처럼 2 개의 테이블이 있으며 지금은 변경할 수 없습니다. – GuruC

+1

SQL Server 2008에서 외래 키가 "작동 중"이라고 말하면서 외래 키 제약 조건을 실제로 가지지 못했을 것입니다 데이터베이스에 선언되었습니다. –

답변

0

귀하의 느낌이 옳습니다. . . 이것은 "정확하지 않습니다". 또는 적어도, 그것은 잘못된 설계 결정입니다.

그러나 외래 키 관계는 아마도 복합 키입니다. 일반적으로이 테이블을 참조하는 다른 열을 지정해야합니다. 합병증은 이것이 "암시적인"열일 수 있다는 것입니다. 따라서 한 테이블에 미국 주소와 기타 비 미국 주소가있는 경우 두 테이블 중 하나에 "IsUS"플래그가 없을 수 있습니다. 그러나 미국 기록은 한 표를, 비 미국은 다른 표를 참조합니다.

또 다른 문제는 이러한 키가 유지되는 방법입니다. 상호 의존적 인 기본 키를 가진 두 개의 테이블을 갖고 싶지는 않습니다. 이를 해결하는 일반적인 방법은 두 테이블을 하나로 결합하는 것입니다.

이것은 나쁜 생각이지만 구조와 함께 살아야 할 수도 있습니다. 그것을 변경할 수 있다면,해야합니다.

관련 문제