![]() |
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
Doppelte Datensätze verhindern in 1:N-Verknüpfung
Hallo,
ich habe diese Tabelle in der Gegenstänge (z.B. Krug, Würfel) enthalten sind.
Code:
Nun soll es zu jedem Gegenstand beliebig viele vom Anwender definierbare Eigenschaften (wie z.B. "rund", "zerbrechlich") geben. Also noch 2 Tabellen dazu:
Gegenstand
---------- PK GegenstandID integer UNQ Groesse varchar(50) UNQ Farbe varchar(50) ...
Code:
Eigenschaft
----------- PK EigenschaftID integer Name varchar(50)
Code:
Wie kann ich nun verhindern, dass gleiche Gegenstände mit gleichen Eigenschaften mehrfach gespeichert werden UND zulassen dass es Gegenstände gibt wo Groesse+Farbe GLEICH sind, aber die Eigenschaften jeweils unterschiedlich sind?
GegenstandEigenschaft
--------------------- PK FK GegenstandID integer PK FK EigenschaftID integer |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Über constraint oder besser (bi) Trigger
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Eindeutigen Index auf GegenstandEigenschaft mit GegenstandID und EigenschaftID?
SQL-Code:
create unique index ix_uni_GegenstandEigenschaft on GegenstandEigenschaft (GegenstandID, EigenschaftIDI;
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Es kommt darauf an, was er gemeint hat. Dieser Index verhindert, dass ein Gegenstand eine Eigenschaft mehrfach zugeordnet wird, aber nicht mehrere gleichartige Gegenstände.
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Schau dir mal
![]() |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Oder
SQL-Code:
Aber auch dies wirkt nur auf die Detailtabelle
update or insert
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zunächst:
Das Unique auf Größe und Farbe ergibt keinen Sinn oder soll wirklich jede Farbe und Größe für sich nur einmalig in der ganzen Tabelle auftauchen? Dann sind Größe und Farbe auch Eigenschaften und können/sollten dort mit aufgenommen werden. Am Ende machst Du auf Deine M:N Tabelle einen PK auf die beiden FK zu Gegenstand und Eigenschaft und das sollte dann okay sein. |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Es gibt DBMS die erlauben in den Indizes auch Funktionen und Formeln. (bzw. k.A. ob Einige sowas nicht erlauben/können)
SQL-Code:
also jeder Gegenstand kann in GegenstandEigenschaft mit nur jeweils einer Eigenschaft vorkommen,
create unique index ix_uni_GegenstandEigenschaft on GegenstandEigenschaft (GegenstandID, EigenschaftID <> '');
-- bzw. (wobei, da GegenstandEigenschaft.EigenschaftID NOT NULL ist, kürzt sich das raus) create unique index ix_uni_GegenstandEigenschaft on GegenstandEigenschaft (GegenstandID, EigenschaftID IS NOT NULL); create unique index ix_uni_GegenstandEigenschaft on GegenstandEigenschaft (GegenstandID, true); create unique index ix_uni_GegenstandEigenschaft on GegenstandEigenschaft (GegenstandID); quasi so als wenn man man in der Tabelle Gegenstand ein Feld EigenschaftID hätte, wo man nur einwas rein bekommt. |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Trigger und Constraints wurden ja schon genannt.
Variante: Du kannst die einzelnen EigenschaftIDs eines Gegenstands in formatierte Strings umwandeln (zB "001", "004", "099", etc) und zu einem String zusammenbauen: "001002099". Haben zwei Gegenstände idente Strings, haben sie gleiche Eigenschaften. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz