У нас есть составной первичный ключ для таблицы сайта, определенной ниже. Функционально это происходит именно так, как мы хотели бы. Каждый сайт должен иметь родительский сайт того же района. Определение таблицы таким способом позволяет специально для этого.
CREATE TABLE [dbo].[site](
[site_number] [nvarchar](50) NOT NULL,
[district_id] [bigint] NOT NULL,
[partner_site_number] [nvarchar](50) NULL,
CONSTRAINT [PK_site] PRIMARY KEY CLUSTERED
(
[site_number] ASC,
[district_id] ASC
)
ALTER TABLE [dbo].[site] WITH CHECK ADD CONSTRAINT [FK_site_site] FOREIGN KEY([partner_site_number], [district_id])
Мой конкретный вопрос касается самоссылающегося FK, определенного на составном ПК. Я слышал несколько мнений об этом конкретном дизайне, и они, как правило, противоречивы. Некоторым это нравится особенно потому, что он функционирует как следует в общем понимании составных ключей. Другие настаивают на том, что это теоретически неверно и что должно быть также поле [partner_district_id], которое включено в FK вместо [district_id]. Этот дизайн потребует проверки для обеспечения того, что [district_id] = [partner_district_id], что может быть сделано либо с проверочным ограничением, либо с логикой уровня приложения.
Буду признателен за дальнейшие мнения относительно этих решений или любых других.