AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Doppelte Datensätze verhindern in 1:N-Verknüpfung

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

Ein Thema von BlueStarHH · begonnen am 22. Jul 2020 · letzter Beitrag vom 30. Jul 2020
Antwort Antwort
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#1

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

  Alt 24. Jul 2020, 20:52
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 );
Gruß, Jo
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
868 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 27. Jul 2020, 09:28
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!
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

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

  Alt 27. Jul 2020, 17:01
Oh sorry, dann verstehe ich Dein Problem nicht.
Meiner Meinung nach löst mein Vorschlag Deine Probleme.
Gruß, Jo
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
868 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 27. Jul 2020, 17:59
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, ...

Geändert von BlueStarHH (27. Jul 2020 um 18:01 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.599 Beiträge
 
Delphi 7 Professional
 
#5

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

  Alt 27. Jul 2020, 18:16
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 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?
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
868 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 27. Jul 2020, 18:20
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 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?
Ja, richtig! Wobei noch wichtig ist, dass es durch die Drei-Tabellen-Lösung mehr als eine Eigenschaft pro Gegenstand geben könnte und können soll.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

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

  Alt 27. Jul 2020, 19:33
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?
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 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