Я пытаюсь смоделировать несколько отношений и неоднократно сталкиваюсь с одной и той же проблемой для нескольких.
Что я пытаюсь сделать, либо с помощью проверочных ограничений, триггеров, либо перепроектированияТаблицы должны обеспечить «правильные» ссылки FK.
Рассмотрим следующую схему:
CREATE TABLE [dbo].[Customer]
[CustomerID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
CREATE TABLE [dbo].[Location]
[LocationID] [int] IDENTITY(1,1) NOT NULL,
[CustomerID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Location] PRIMARY KEY CLUSTERED
ALTER TABLE [dbo].[Location] ADD CONSTRAINT [FK_Location_CustomerID_Customer] FOREIGN KEY([CustomerID]) REFERENCES [dbo].[Customer] ([CustomerID])
CREATE TABLE [dbo].[CustomerDivision]
[CustomerDivisionID] [int] IDENTITY(1,1) NOT NULL,
[CustomerID] [int] NOT NULL,
[Name] [nvarchar](20) NOT NULL,
CONSTRAINT [PK_CustomerDivision] PRIMARY KEY CLUSTERED
ALTER TABLE [dbo].[CustomerDivision] ADD CONSTRAINT [FK_CustomerDivision_CustomerID_Customer] FOREIGN KEY([CustomerID]) REFERENCES [dbo].[Customer] ([CustomerID])
CREATE TABLE [dbo].[LocationDivision]
[LocationDivisionID] [int] IDENTITY(1,1) NOT NULL,
[LocationID] [int] NOT NULL,
[CustomerDivisionID] [int] NOT NULL,
CONSTRAINT [PK_LocationDivision_1] PRIMARY KEY CLUSTERED
ALTER TABLE [dbo].[LocationDivision] ADD CONSTRAINT [FK_LocationDivision_LocationID_Location] FOREIGN KEY([LocationID]) REFERENCES [dbo].[Location] ([LocationID])
Divisions
и Locations
оба принадлежат Customers
, но только выберите Divisions
применить к конкретному Location
.
Я изо всех сил пытаюсь найти простой способ гарантировать, что только LocationDivisons
получит "действительную" CustomerDivisionID
ссылку на внешний ключ, если CustomerDivision.CustomerID = Location.CustomerID
Добавление дополнительных пояснений
dbo.Customer(CustomerID,Name)
VALUES (1,Customer 1),
(2,Customer 2)
dbo.Location(LocationID, CustomerID, Name)
VALUES (1,1,Location 1),
(2,2,Location 2)
dbo.CustomerDivision(CustomerDivisionID, CustomerID, Name)
VALUES (1,1,Customer 1 Division 1),
(2,1,Customer 1 Division 2)
dbo.LocationDivisionID(LocationDivisionID, LocationID, CustomerDivisionID)
VALUES (1,1,1),
(2,2,1) <---- This should fail as the this CustomerDivision.CustomerID <> Location.CustomerID