如何通过另一个表设置分层外键?

时间:2015-02-01 12:34:51

标签: sql sql-server entity-framework

我不确定我的标题是否真的解释了这个问题,所以我试着举个例子:

我们说我有:

1) region 表:同一表格中的父区域和子区域(链接 A

2)产品表:每个产品都链接到一个父母区域(链接 B

3) product_price 表:列出该产品区域所有子区域的产品价格( C )(链接 D > ;>>相关链接。)

(该图仅显示相关字段, region product 中有更多数据) tables diagram

有没有办法定义 region-> region_price 键,只包含 product->区域键中parent_region的sub_region_id? ??

或者,在图片方面,如何使 D 链接仅包含 A 中的子区域B & C 链接?

希望你明白我的意思......

以下是真实的表格和链接:

CREATE TABLE [dbo].[product](
    [product_id] [int] NOT NULL,
    [product_name] [nchar](10) NOT NULL,
    [parent_region_id] [int] NOT NULL,
 CONSTRAINT [PK_product] PRIMARY KEY CLUSTERED 
(
    [product_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]

CREATE TABLE [dbo].[product_price](
    [product_id] [int] NOT NULL,
    [sub_region_id] [int] NOT NULL,
    [price] [decimal](18, 0) NOT NULL,
 CONSTRAINT [PK_product_price] PRIMARY KEY CLUSTERED 
(
    [product_id] ASC,
    [sub_region_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]

CREATE TABLE [dbo].[region](
    [region_id] [int] NOT NULL,
    [region_name] [nvarchar](50) NOT NULL,
    [parent_region_id] [int] NULL,
 CONSTRAINT [PK_region] PRIMARY KEY CLUSTERED 
(
    [region_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]

ALTER TABLE [dbo].[product]  WITH CHECK ADD  CONSTRAINT [FK_product_region] FOREIGN KEY([parent_region_id])
REFERENCES [dbo].[region] ([region_id])

ALTER TABLE [dbo].[product] CHECK CONSTRAINT [FK_product_region]

ALTER TABLE [dbo].[product_price]  WITH CHECK ADD  CONSTRAINT [FK_product_price_product] FOREIGN KEY([product_id])
REFERENCES [dbo].[product] ([product_id])

ALTER TABLE [dbo].[product_price] CHECK CONSTRAINT [FK_product_price_product]

ALTER TABLE [dbo].[product_price]  WITH CHECK ADD  CONSTRAINT [FK_product_price_region] FOREIGN KEY([sub_region_id])
REFERENCES [dbo].[region] ([region_id])

ALTER TABLE [dbo].[product_price] CHECK CONSTRAINT [FK_product_price_region]

ALTER TABLE [dbo].[region]  WITH CHECK ADD  CONSTRAINT [HK_region_region] FOREIGN KEY([parent_region_id])
REFERENCES [dbo].[region] ([region_id])

ALTER TABLE [dbo].[region] CHECK CONSTRAINT [HK_region_region]

1 个答案:

答案 0 :(得分:0)

我猜你试图用数据库规则强制执行业务规则,但它们并不总是相同。相反,您可以在插入或更新之前在代码中运行验证查询,或者您可以实现验证规则或引发错误的触发器。