2017-11-12 1 views
1

Ich habe Tabellen mit folgendem Layout anwenden:Wie eine eindeutige Einschränkung über mehrere Hierarchieebenen

  • A Project können viele Entity Beziehungen haben. Eine Entity kann viele DataPoint Beziehungen haben.

Wie kann ich erzwingen, dass die Name Spalte der Tabelle DataPoint pro Projekt eindeutig sein muss?

Derzeit habe ich einen Fremdschlüssel in Entity für das Projekt und einen anderen Fremdschlüssel in DataPoint für die Entität. Ich dachte über das Hinzufügen der ProjectId als eine andere Fremdschlüsselspalte in der DataPoint Tabelle, so dass ich eine eindeutige Integritätsbedingung mit DataPoint.ProjectId, DataPoint.Name erstellen konnte, aber das würde ein neues Problem einführen, nicht in der Lage zu garantieren, dass DataPoint.EntityId tatsächlich ein Kind von DataPoint ist. Projekt-ID

+0

Ich glaube nicht, dass Sie solche hierarchischen Einschränkungen in Ihrer Datenbank benötigen, und ich könnte argumentieren, dass die Notwendigkeit solcher Contraints eine schlechte Anwendungslogik impliziert. –

+0

@TimBiegeleisen, ich wünschte du hättest deine Antwort nicht gelöscht. Es hat mich zum Nachdenken gebracht, konnte ich nicht einen zusammengesetzten Fremdschlüssel mit ProjectId und EntityId von 'DataPoint' zu 'Entity' haben? Das würde die eindeutige Integritätsbedingung erlauben und auch garantieren, dass das Projekt/Entity-Paar gültig ist, oder nicht? – adam0101

+0

Das ist über meinen Kopf :-(... jemand anderes wird hoffentlich antworten. –

Antwort

0

Sie möchten verhindern, dass zwei Entitäten, die auf dasselbe Projekt verweisen, die gleichen Datenpunkte haben. Dies wird nicht direkt von SQL-Einschränkungen unterstützt, was bedeutet, dass Trigger eine Lösung darstellen.

Sie können das gleiche tun, wenn Sie ein wenig zusätzlichen Overhead erleiden: enthalten Sie die projectid in datapoint. Dann sind die folgenden Einschränkungen:

constraint foreign key (projectid, entityid) refers to entities(projectid, entityid); 

constraint unique (projectid, name); 

Die erste Bedingung ist redundant (projectid ist nicht erforderlich), aber es gibt wenig Schaden mit ihm. Das größte Problem ist, dass Sie die projectid in datapoint einfügen müssen - und vergessen Sie nicht, es einzufügen.

+0

Danke. Wissen Sie, ob der zusammengesetzte Fremdschlüssel auf einen zusammengesetzten Primärschlüssel verweisen muss? Ich glaube, ich habe irgendwo gelesen, dass zusammengesetzte Fremdschlüssel entweder a Composite PK oder UC in der Elterntabelle Kannst du bestätigen? – adam0101

Verwandte Themen