すでに述べたように、「User」という名前のオブジェクトと「Person」という名前のオブジェクトがあります。これら2つには、「すべての「人」は間違いなく「ユーザー」である」というファクトリー関係がありますが、「すべての「ユーザー」は「人」ではない可能性があります」、つまり「すべての「ユーザー」は「人」でもある」という意味です。 'PersonOrder'をジャンクションテーブルとして使用して'Person'sを関連付けました。他の制約は、ジャンクションテーブルとして"各子'Person'は一意である必要があります"ということです。
本当に実装する必要がある限りですが、これは正規化された構造です。もし私があなたなら、私はこのように実装するでしょう。
図へのリンク:http ://sdrv.ms/ROVtJc
乾杯
USE [temp]
GO
/****** Object: Table [dbo].[User] Script Date: 09/06/2012 17:11:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Age] [tinyint] NOT NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[Id] 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].[Person] Script Date: 09/06/2012 17:11:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
[Id] [bigint] NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[Id] 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].[PersonOrder] Script Date: 09/06/2012 17:11:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[PersonOrder](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Person_Parent_Id] [bigint] NOT NULL,
[Person_Child_Id] [bigint] NOT NULL,
CONSTRAINT [PK_PersonOrder] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [IX_FriendOrder_Child_Unique] UNIQUE NONCLUSTERED
(
[Id] 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_Person_User] Script Date: 09/06/2012 17:11:23 ******/
ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [FK_Person_User] FOREIGN KEY([Id])
REFERENCES [dbo].[User] ([Id])
GO
ALTER TABLE [dbo].[Person] CHECK CONSTRAINT [FK_Person_User]
GO
/****** Object: ForeignKey [FK_PersonOrder_Person_Child] Script Date: 09/06/2012 17:11:23 ******/
ALTER TABLE [dbo].[PersonOrder] WITH CHECK ADD CONSTRAINT [FK_PersonOrder_Person_Child] FOREIGN KEY([Person_Parent_Id])
REFERENCES [dbo].[Person] ([Id])
GO
ALTER TABLE [dbo].[PersonOrder] CHECK CONSTRAINT [FK_PersonOrder_Person_Child]
GO
/****** Object: ForeignKey [FK_PersonOrder_Person_Parent] Script Date: 09/06/2012 17:11:23 ******/
ALTER TABLE [dbo].[PersonOrder] WITH CHECK ADD CONSTRAINT [FK_PersonOrder_Person_Parent] FOREIGN KEY([Person_Child_Id])
REFERENCES [dbo].[Person] ([Id])
GO
ALTER TABLE [dbo].[PersonOrder] CHECK CONSTRAINT [FK_PersonOrder_Person_Parent]
GO