Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Doppelte Datensätze verhindern in 1:N-Verknüpfung (https://www.delphipraxis.net/205003-doppelte-datensaetze-verhindern-1-n-verknuepfung.html)

BlueStarHH 22. Jul 2020 15:52

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:
Gegenstand
----------
PK GegenstandID integer
UNQ Groesse varchar(50)
UNQ Farbe varchar(50)
...
Nun soll es zu jedem Gegenstand beliebig viele vom Anwender definierbare Eigenschaften (wie z.B. "rund", "zerbrechlich") geben. Also noch 2 Tabellen dazu:

Code:
Eigenschaft
-----------
PK EigenschaftID integer
   Name varchar(50)
Code:
GegenstandEigenschaft
---------------------
PK FK GegenstandID integer
PK FK EigenschaftID integer
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?

mkinzler 22. Jul 2020 15:59

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Über constraint oder besser (bi) Trigger

Delphi.Narium 22. Jul 2020 16:51

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;

mkinzler 22. Jul 2020 17:16

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.

EgonHugeist 22. Jul 2020 17:29

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Schau dir mal https://firebirdsql.org/refdocs/langrefupd21-merge.html an. Ein roundtrip..

mkinzler 22. Jul 2020 17:33

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Oder
SQL-Code:
update or insert
Aber auch dies wirkt nur auf die Detailtabelle

jobo 22. Jul 2020 17:36

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.

himitsu 22. Jul 2020 17:50

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:
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);
also jeder Gegenstand kann in GegenstandEigenschaft mit nur jeweils einer Eigenschaft vorkommen,
quasi so als wenn man man in der Tabelle Gegenstand ein Feld EigenschaftID hätte, wo man nur einwas rein bekommt.

mkinzler 22. Jul 2020 17:55

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Nennt man "Expression Index"

https://firebirdsql.org/rlsnotesh/in...xpression.html

TigerLilly 23. Jul 2020 08:19

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 14:23 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz