![]() |
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. |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Ich finde das Konzept der Eigenschaften schon zu schwammig und würde eher mit Merkmalen und Merkmalsausprägungen arbeiten.
Sonst erstelle ich einen roten Krug mit Eigenschaft zerbrechlich. Der nächste erstellt einen roten Krug mit Eigenschaft unzerbrechlich und rund. Kommt der dritte rote Krug und der User wählt aus den ja jetzt angelegten Eigenschaften zerbrechlich und unzerbrechlich aus und du hast ein fragwürdiges Objekt. |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
Bin gespannt, was noch so dazu kommt bis der TE sich meldet. (falls er sich meldet) |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
Zitat:
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
Hier eine detailiertere Formulierung: Du legst auf Deine M:N Verbindungstabelle "GegenstandEigenschaft" einen Primärschlüssel auf die beiden Fremdschlüssel, die auf Gegenstand und Eigenschaft zeigen. Das sollte alles sein. Als SQL:
Code:
create table GegenstandEigenschaft( GegenstandID bigint , EigenschaftID bigint ); alter table GegenstandEigenschaft ADD PRIMARY KEY (GegenstandID,EigenschaftID ); alter table GegenstandEigenschaft ADD foreign KEY (GegenstandID) references Gegenstand(GegenstandID); alter table GegenstandEigenschaft ADD foreign KEY (EigenschaftID ) references Eigenschaft(EigenschaftID ); |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
Code:
Hilft mir aber nicht mein Problem vollständig zu lösen. Trigger oder Contraints sind wohl doch noch zusätzlich nötig... Hat jemand ein Beispeil wie ein Trigger oder Contraints für meinen Anwendungsfall aussehen könnte? Danke!
GegenstandEigenschaft
--------------------- PK FK GegenstandID integer PK FK EigenschaftID integer |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Oh sorry, dann verstehe ich Dein Problem nicht.
Meiner Meinung nach löst mein Vorschlag Deine Probleme. |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
Code:
Das zusammengejoint ergibt dann:
Gegenstand
---------- GegenstandID Groesse Farbe 1 50x90 weiß 2 XL blau 3 XL blau Eigenschaft ----------- EigenschaftID Name 1 brennbar 2 zerbrechlich GegenstandEigenschaft --------------------- GegenstandID EigenschaftID 1 2 2 1 3 1
Code:
Einfach zu sehen, dass die letzten beiden Datensätze doppelt sind. Kein PK und FK haben das verhindert. Das darf nicht sein.
GegenstandID Groesse Farbe Eigenschaft
1 50x90 weiß zerbrechlich 2 XL blau brennbar 3 XL blau brennbar In Tabelle "Gegenstand" muss es möglich sein, bis auf die ID gleiche Datensätze anzulegen, da sie ja unterschiedlich Eigenschaften haben könnten. Also sowas sollte möglich sein:
Code:
GegenstandID Groesse Farbe Eigenschaft
1 50x90 weiß zerbrechlich 2 XL blau leicht, ... 3 XL blau lang, ... |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Wären diese Daten aus einer Tabelle,
Code:
würdest Du also einen Index der Form
GegenstandID Groesse Farbe Eigenschaft
1 50x90 weiß zerbrechlich 2 XL blau brennbar 3 XL blau brennbar
SQL-Code:
benötigen.
create unique index ix_Groesse_Farbe_Eigenschaft on tabelle (Groesse, Farbe, Eigenschaft);
Da es sich aber um zwei Tabellen handelt, brauchst Du eine entsprechende "tabellenübergreifende" Lösung. Hab' ich das so (in etwa) richtig verstanden? |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Wie geht das mit dem bisher geforderten übernander?
Würden die Beispieldaten aus #20 mit dem genannten unique Index aus #20 überhaupt existieren? Wie wär es, wenn BluestarHH mal positive und negative Beispiel aufführt, um sein Problem plastischer zu machen? |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
Zitat:
create unique index ix_Groesse_Farbe_Eigenschaft on tabelle (Groesse, Farbe, Eigenschaft) Das geht bei mir aber nicht, da ich 3 Tabellen habe und haben muss. Ein positiv und negativ Beispiel findest Du in #19. |
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Bei dem von mir vorgeschlagenen Index würde die dritte Zeile im Beispiel zu einer Indexverletzung führen und wäre somit nicht möglich.
|
AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
Zitat:
Aber wie auch immer, ich hab's endlich kapiert, sorry. Wenn unter keinen Umständen das bestehende System verändert, sondern nur erweitert werden soll, ja dann muss man häßliche Dinge machen mit Triggern. Ich würde wie eingangs vorgeschlagen die Farbe und Größe mit in die Eigenschaften übernehmen. Falls der Erhalt als "Originalspalte" unabdingbar ist, würde ich das per View einblenden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 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