2012-06-22 137 views
1

我有大約8個實體都與一個公共實體有一對一的關係。SQL數據實體實體關聯

客戶端沒有從預定義數據中進行選擇,因此沒有必要將FK用作約束條件。

有問題的主表稱爲完成表,它包含從客戶端發送到服務器的四種未知十六進制顏色。

例如,當建造門時,門的不同部分和其外部部分的顏色都可以具有不同的顏色。因此,所有這些表格都是有問題的,它們的數據總是來自客戶端的新鮮數據,而不是從下拉菜單中選擇,或者從我提供給客戶端選擇的其他預定義數據中選擇。

我的問題是,將這個完成實體與需要表達其完成的其他實體關聯的最佳方法是什麼?

我正在添加一個我正在處理的圖表的屏幕截圖,這些不是所有的實體,而只是現在正在討論的圖表,以及將幫助向他人闡述我需要解決方案的圖表。

我還包括一些腳本。

/****** 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 

下面需要實體的每一個與終點表關聯。每個實體新記錄都有一個完成關係。 是否有可能將這些關聯,並且仍然能夠在DELETE上執行級聯,不帶有循環引用問題?

Schema Candidate

+0

您可以更詳細地解釋一下級聯刪除的要求嗎?您預計哪個記錄被刪除,以及您預計哪些(相關)記錄需要自動刪除? – Geoff

回答

0

是的,這是可能的。

您將在每個與其具有關係的表中添加對Finish實體的引用。

您將定義具有相同數據類型(通常爲)的列作爲referenced_table_name和id。在我們的商店中,column_name應該是[finish_id]。 (我在這裏看到你使用的是CamelCase風格。)

無論如何,我建議你將其定義爲外鍵。

你說沒有必要,但是從你所描述的情況來看,這正是需要外鍵約束的情況。

您需要決定更新或刪除完成表中的ID時的操作。 (你想禁止更新或刪除嗎?你想保留現有的關係嗎?)我希望你想要默認的ON DELETE RESTRICT。你可以允許更新,並保持與ON UPDATE CASCADE的關係。)

我沒有看到任何循環引用的潛在問題,只要完成表將是父級(所有其他表引用它,並且完成表沒有任何對其他表的引用。)

+0

這正是我一直在尋找的。感謝您的「這就是我們正在做的信息」。當我開始設計一個數據庫時,我總是會問很多問題,他們只是難以撤銷。;)就刪除而言,我接近這一點的方式是不可能刪除一個孩子的完成。所以,你的意思是把FK作爲完成表中的門表放入一個實體中。當門被刪除時,抓住finishID並刪除完成記錄。謝謝你的幫助。 –