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
Seite 1 von 3  1 23   
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
638 Beiträge
 
Delphi 10.3 Rio
 
#1

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

  Alt 22. Jul 2020, 16:52
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.802 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 22. Jul 2020, 16:59
Über constraint oder besser (bi) Trigger
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.907 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 22. Jul 2020, 17:51
Eindeutigen Index auf GegenstandEigenschaft mit GegenstandID und EigenschaftID?

create unique index ix_uni_GegenstandEigenschaft on GegenstandEigenschaft (GegenstandID, EigenschaftIDI;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.802 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 22. Jul 2020, 18:16
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.
Markus Kinzler
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

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

  Alt 22. Jul 2020, 18:29
Schau dir mal https://firebirdsql.org/refdocs/langrefupd21-merge.html an. Ein roundtrip..
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.802 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 22. Jul 2020, 18:33
Oder update or insert Aber auch dies wirkt nur auf die Detailtabelle
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

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

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

  Alt 22. Jul 2020, 18:36
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.709 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 22. Jul 2020, 18:50
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.802 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 22. Jul 2020, 18:55
Nennt man "Expression Index"

https://firebirdsql.org/rlsnotesh/in...xpression.html
Markus Kinzler
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
914 Beiträge
 
Delphi 10.3 Rio
 
#10

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

  Alt 23. Jul 2020, 09:19
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

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 06:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf