2012-06-22 142 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并删除完成记录。谢谢你的帮助。 –