Nous avons une clé primaire composite pour la table de site définie ci-dessous. Fonctionnellement, cela fait exactement ce que nous voudrions. Chaque site devrait avoir un site parent du même district. Définir la table de cette manière permet spécifiquement cela.Clé composite sur un tableau auto-référencé
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])
Ma question spécifique concerne le FK auto-référencé défini sur un PK composite. J'ai entendu quelques opinions sur cette conception particulière et ils ont tendance à être contradictoires. Certains l'aiment particulièrement parce qu'il fonctionne comme il le devrait dans le cadre d'une compréhension générale des touches composites. D'autres insistent sur le fait qu'il est théoriquement incorrect et qu'il devrait aussi y avoir un champ [partner_district_id] qui est inclus dans le FK au lieu de [district_id]. Cette conception nécessiterait une validation pour appliquer le [district_id] = [partner_district_id], ce qui pourrait être fait avec une contrainte de vérification ou une logique au niveau de l'application.
D'autres opinions sur ces solutions ou d'autres seraient appréciées.
nommer un commentaire ... L'identificateur de site n'est-il pas unique en soi? Parce que le nom Site_id implique que iut est. Si elle n'est unique qu'en combinaison avec District_Id, alors elle est peut-être mal nommée ... il pourrait être plus clair si c'était site_Sequence, ou District_site_No, ou autre chose ... –