1

共通のエンティティと 1 対 1 の関係を持つ約 8 つのエンティティがあります。

クライアントは事前定義されたデータから選択しないため、制約として使用する FK を適用する必要はありません。

問題のメイン テーブルは終了テーブルと呼ばれ、クライアントからサーバーに送信される 4 つの未知の 16 進数の色が含まれています。

たとえば、ドアが構築されている場合、ドアのさまざまな部分の色とその外側の部分はすべて異なる色にすることができます。したがって、問題のこれらのテーブルはすべて、そのデータは常にクライアントから取得されたばかりであり、ドロップダウンから選択されたり、クライアントに提供されて選択できる他の事前定義されたデータから選択されたりすることはありません。

私の質問は、この終了エンティティを終了を表現する方法が必要な他のエンティティと関連付ける最良の方法は何でしょうか?

私が取り組んでいる図のスクリーンショットを追加しています。これらはすべてのエンティティではなく、現在問題になっているものであり、解決策が必要なものを他の人に明確にするのに役立つものです.

いくつかのスクリプトも含めました。

    /****** Object:  Table [dbo].[Finish]    Script Date: 06/22/2012 15:08:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Finish](
    [ID] [int] NOT NULL,
    [Left] [varchar](30) NULL,
    [Right] [varchar](30) NULL,
    [Top] [varchar](30) NULL,
    [Bottom] [varchar](30) NULL,
    [Note] [varchar](150) NULL,
 CONSTRAINT [PK_Finish] 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
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Horizontal]    Script Date: 06/22/2012 15:08:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Horizontal](
    [ID] [int] IDENTITY(11,1) NOT NULL,
    [Name] [varchar](15) NOT NULL,
    [Floor] [smallint] NOT NULL,
    [SizeID] [int] NOT NULL,
    [GlassPocket] [decimal](5, 3) NULL,
    [IsFiller] [bit] NOT NULL,
    [Note] [varchar](150) NULL,
 CONSTRAINT [PK_Horizontal] 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
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Door]    Script Date: 06/22/2012 15:08:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Door](
    [ID] [int] IDENTITY(421,1) NOT NULL,
    [BayID] [int] NOT NULL,
    [Position] [tinyint] NOT NULL,
    [HasJamb] [bit] NOT NULL,
    [HasThreshold] [bit] NOT NULL,
    [IsAutoShowroom] [bit] NOT NULL,
    [IsSingle] [bit] NOT NULL,
    [Type] [varchar](10) NOT NULL,
    [SizeID] [int] NOT NULL,
    [Note] [varchar](150) NULL,
 CONSTRAINT [PK_Door] 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
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Leaf]    Script Date: 06/22/2012 15:08:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Leaf](
    [ID] [int] IDENTITY(21,1) NOT NULL,
    [DoorID] [int] NOT NULL,
    [Position] [tinyint] NOT NULL,
    [Stile] [varchar](10) NOT NULL,
    [Bottomrail] [decimal](5, 3) NOT NULL,
    [Hand] [varchar](5) NOT NULL,
    [IsActive] [bit] NOT NULL,
    [Swing] [varchar](5) NOT NULL,
    [SizeID] [int] NOT NULL,
    [Note] [varchar](150) NULL,
 CONSTRAINT [PK_Leaf] 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
SET ANSI_PADDING OFF
GO
/****** Object:  Table [dbo].[Bay]    Script Date: 06/22/2012 15:08:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Bay](
    [ID] [int] IDENTITY(1213,1) NOT NULL,
    [ElevationID] [int] NOT NULL,
    [Position] [tinyint] NOT NULL,
    [SizeID] [int] NOT NULL,
    [Note] [varchar](150) NULL,
 CONSTRAINT [PK_Bay] 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
SET ANSI_PADDING OFF
GO

以下の各エンティティを仕上げテーブルに関連付ける必要があります。各エンティティの新しいレコードには、終了関係が 1 つだけあります。これらを関連付けて、循環参照の問題を発生させずに Cascade On DELETE を実行することは可能ですか?

スキーマ候補

4

1 に答える 1

0

はい、可能です。

関係のある各テーブルにFinishエンティティへの参照を追加します。

(通常は)referenced_table_nameおよびidと同じデータ型で列を定義します。当店では、column_nameは[finish_id]になります。(ここでは、キャメルケーススタイルを使用していることがわかります。)

とにかく、これを外部キーとして定義することをお勧めします。

あなたはそうする必要はないと言いますが、あなたが説明することから、これはまさに外部キー制約を必要とする種類の状況です。

フィニッシュテーブルのIDが更新または削除されたときのアクションを決定する必要があります。(更新または削除を禁止しますか?既存の関係を保持しますか?)デフォルトのONDELETERESTRICTが必要になると思います。ON UPDATE CASCADEを使用して、更新を許可し、関係を保持することができます。)

フィニッシュテーブルが親になる限り、循環参照に潜在的な問題はありません(他のすべてのテーブルがそれを参照し、フィニッシュテーブルには他のテーブルへの参照がありません)。

于 2012-06-22T21:53:58.527 に答える