Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Jumpy 23. Jul 2020 11:41

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.

jobo 23. Jul 2020 19:07

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Zitat:

Trigger und Constraints wurden ja schon genannt..
Lustig, es wurde ja nun fast alles genannt, was eine Lösung für irgendein Datenbank Problem sein könnte.
Bin gespannt, was noch so dazu kommt bis der TE sich meldet.
(falls er sich meldet)

BlueStarHH 24. Jul 2020 12:19

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Zitat:

Zitat von mkinzler (Beitrag 1470125)
Über constraint oder besser (bi) Trigger

Danke an alle für die Antworten. Wie würden den eine Constraint oder Trigger aussehen? Stehe da gerade etwas auf dem Schlauch...

BlueStarHH 24. Jul 2020 12:22

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Zitat:

Zitat von jobo (Beitrag 1470140)
Zunächst:
Das Unique auf Größe und Farbe ergibt keinen Sinn

Jup, eine Altlast. Kann und muss weg.

Zitat:

Zitat von jobo (Beitrag 1470140)
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.

Hab mir den Satz jetzt mehrfach durchgelesen: Habe ich das nicht schon gemacht oder verstehe ich den Satz falsch?

BlueStarHH 24. Jul 2020 12:24

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Zitat:

Zitat von mkinzler (Beitrag 1470135)
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.

Zu erst möchte ich gleichartige Gegenstände verhindern. Wenn man dann auch noch verhindern kann, dass eine Eigenschaft dem selben Gegenstand mehrfach zugeordet wird, ist das noch besser.

jobo 24. Jul 2020 20:52

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Zitat:

Zitat von BlueStarHH (Beitrag 1470288)
Zitat:

Zitat von jobo (Beitrag 1470140)
Zitat:

Zitat von jobo (Beitrag 1470140)
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.

Hab mir den Satz jetzt mehrfach durchgelesen: Habe ich das nicht schon gemacht oder verstehe ich den Satz falsch?




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 );

BlueStarHH 27. Jul 2020 09:28

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Zitat:

Zitat von jobo (Beitrag 1470333)
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 );

Genau das habe ich schon gemacht. Siehe mein Eingangspost, da ist das sehr verkürzt mit PK (PRIMARY KEY) und FK (Foreign KEY) dargestellt:

Code:
GegenstandEigenschaft
---------------------
PK FK GegenstandID integer
PK FK EigenschaftID integer
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!

jobo 27. Jul 2020 17:01

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.

BlueStarHH 27. Jul 2020 17:59

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Zitat:

Zitat von jobo (Beitrag 1470486)
Oh sorry, dann verstehe ich Dein Problem nicht.
Meiner Meinung nach löst mein Vorschlag Deine Probleme.

Dann gebe ich mal ein Beispiel um das zu verdeutlichen:

Code:
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
Das zusammengejoint ergibt dann:

Code:
GegenstandID Groesse Farbe Eigenschaft
1             50x90    weiß   zerbrechlich
2             XL      blau  brennbar
3             XL      blau  brennbar
Einfach zu sehen, dass die letzten beiden Datensätze doppelt sind. Kein PK und FK haben das verhindert. Das darf nicht sein.

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, ...

Delphi.Narium 27. Jul 2020 18:16

AW: Doppelte Datensätze verhindern in 1:N-Verknüpfung
 
Wären diese Daten aus einer Tabelle,
Code:
GegenstandID Groesse Farbe Eigenschaft
1             50x90    weiß   zerbrechlich
2             XL     blau brennbar
3             XL     blau brennbar
würdest Du also einen Index der Form
SQL-Code:
create unique index ix_Groesse_Farbe_Eigenschaft on tabelle (Groesse, Farbe, Eigenschaft);
benötigen.

Da es sich aber um zwei Tabellen handelt, brauchst Du eine entsprechende "tabellenübergreifende" Lösung.

Hab' ich das so (in etwa) richtig verstanden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr.
Seite 2 von 3     12 3      

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