Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL: Set of Integer? (https://www.delphipraxis.net/70192-sql-set-integer.html)

fkerber 26. Mai 2006 15:23

Datenbank: Absolute Database • Zugriff über: native

SQL: Set of Integer?
 
Hi!

Ich habe folgendes vor und suche nach einer Möglichkeit, dass in einer DB umzusetzen:
Ich habe verschiedene Gruppen, z.B. Häuser (ID = 0), Brücken (ID = 1), Bäume (ID = 2), Sträucher (ID = 3) etc.

Jetzt soll es eine Foto-DB geben und ein Foto kann eben zu mehreren Gruppen gehören. Ein Foto kann also bspw. eine Brücke und einen Baum zeigen. Jetzt war mein erster Gedanke, ich hab ein String-Feld in der DB, das dann z.B. so aussieht:

Zitat:

1,2
Irgendwie erscheint mir das aber nicht sinnvoll, zumal die SQL-Abfrage wohl ziemlich kompliziert ist.


Wie löst man sowas denn effizient?


Ciao Frederic

Flare 26. Mai 2006 15:26

Re: SQL: Set of Integer?
 
Vielleicht mit Bitoperationen und nem Integer...
Mein Vorschlag :zwinker:


Flare

fkerber 26. Mai 2006 15:27

Re: SQL: Set of Integer?
 
Hi!

Könntest du das etwas näher ausführen?


Ciao Frederic

Flare 26. Mai 2006 15:37

Re: SQL: Set of Integer?
 
Delphi-Quellcode:
const
 Baum = 1;
 Strauch = 2;
 Brücke = 4;

...

if (Eigenschaften and Baum)=Baum then ... //Baum ist auf dem Bild
if (Eigenschaften and Strauch)=Strauch then ... //Baum ist auf dem Bild

...
Und das speichern geht dann etwa so
Delphi-Quellcode:
Eigenschaften := 0;
if Baum_auf_Bild then Eigenschaften := Eigenschaften or Baum;
if Strauch_auf_Bild then Eigenschaften := Eigenschaften or Strauch;
...
So stell ich mir das vor.


Flare

fkerber 26. Mai 2006 15:43

Re: SQL: Set of Integer?
 
Hi!

Das würde aber bedeuten, dass die IDs Zweierpotenzen sind, oder?


Ciao Frederic

Flare 26. Mai 2006 15:44

Re: SQL: Set of Integer?
 
Ja, würde es :thumb:
Das wirft dich dann vielleicht in deiner Planung ein bisschen um, aber ich denke diese Methode ist relativ platzsparend...


Flare

alzaimar 26. Mai 2006 15:52

Re: SQL: Set of Integer?
 
Das widerspricht aber dem SQL-Gedanken... Besser ist sowas hier:

Die Tabelle Bilder hat eine ID.
Die Tabelle Bildattribute hat zwei Felder: ID und Attribut.

Alle Attribute eines Bildes mit der ID 12345 bekommst Du mit
SQL-Code:
Select Attribut from BildAttribute where ID = 12345
Alle Bilder, die die Attribute 1,5,9,20 und 12435764 haben, bekommst Du mit
SQL-Code:
Select distinct ID from BildAttribute where Attribute in (1,5,9,20,12435764)
Vorteile:
1.Wesentlich schneller (Wenn ein Index auf den Attributen sitzt)
2.SQL konform
3.Mehr als 32 Attribute sind möglich

Dann kannst Du dir noch eine Tabelle 'Attribute' bauen, die hat zwei Spalten:
Attribut, Beschreibung.

Somit hast du gleich die textuelle Repräsentation eines Bildattributes in der DB und kannst Dir mit einer einfach DBLookupCombo die Attributliste zusammenklicken.

fkerber 26. Mai 2006 16:10

Re: SQL: Set of Integer?
 
Hi!

Also ich brauche def. mehr als 32 Gruppen, also nix mit Bitoperatoren. :wink:

@alzaimar:
so ganz komm ich nicht mit..

Wie sähen denn die Tabellen und die Einträge aus, so?

Zitat:

Tabelle Bilder:

ID # Pfad
----------------------
0 # c:\asdasdasd.jpg
1 # c:\asdjadjkha.jpg

Zitat:

Tabelle Bildattribute

ID # Attribut
--------------------
0 # 10,50,67
1 # 46,56,67,10
Wäre das richtig? Welchen Typ hat denn das Feld Attribut?
Irgendwie komm ich nicht mit, sry


Ciao Frederic

alzaimar 26. Mai 2006 16:16

Re: SQL: Set of Integer?
 
Mit konkreten Beispielen geht das immer sehr gut:

Tabelle Bildattribute

ID # Attribut
--------------------
0 # 10,50,67
1 # 46,56,67,10


So nicht, aber so:

ID Attribut
-----------
0 10
0 50
0 67
1 46
1 56
1 67
1 10

Bei einem Update, also wenn Du die Attribute verändern willst, löschst Du einfach alle Attribute der Bild ID und fügst hinterher alle ein. Das geht am einfachsten, wenn du dir ein SQL-Skript zusammenbastelst.

Nehmen wir an, Du willst dem Bild #1 jetzt die Attribute 5,7 und 9 verpassen. Dann sieht das Skript so aus:
SQL-Code:
Delete from BildAttribute Where ID = 1
insert into BildAttribute
  select 1,5 union
  select 1,7 union
  select 1,9
Denk dran, bei vielen Bildern ein Index auf die ID und einen Index auf das Attribut der Tabelle 'BildAttribute' zu legen. Dann geht das Eins-Fix-Drei!

fkerber 27. Mai 2006 10:51

Re: SQL: Set of Integer?
 
Hi!

Super, danke für die Ausführungen!
Werde ich dann so umsetzen!

Danke :thumb:


Ciao Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr.

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