AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Basic-Frage

Ein Thema von erich.wanker · begonnen am 13. Feb 2013 · letzter Beitrag vom 13. Feb 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
454 Beiträge
 
Delphi XE4 Professional
 
#1

Basic-Frage

  Alt 13. Feb 2013, 13:25
Datenbank: firebird • Version: 2.1 • Zugriff über: ZEOS 6.6.6
Hallo Leute...
eine sehr einfache Frage:

Ich möchte einen Datensatz kategorisieren ( über 40 dynamische AND/OR Kategorie-Möglichkeiten stehen zur Verfügung)

Bis dato (oh Gott, ich trau es mir gar nicht zu sagen..)schreib ich in ein "1000 char" Feld
einen String wie diesen: a1c5d2a2d4

Code:
a1 = "Deutschland"
c5 = "Privatperson"
d2 = "BMW"
ect
Nun suche ich alle Privatpersonen aus Deutschland die einen BMW fahren

select X from Y where ..
and feld containing "a1"
and feld containing "c5"
and feld containing "d2"

...


ist natürlich a Wahnsinns Performancebremse ..

Wie macht man das OPTIMAL?

Vielen Dank
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Basic-Frage

  Alt 13. Feb 2013, 13:30
Normalisierung
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#3

AW: Basic-Frage

  Alt 13. Feb 2013, 13:33
Bei deinem Beispiel würde ich der Tabelle für jedes Attribut ein Feld spendieren:
LAND - VARCHAR(50)
PRIVAT - SMALLINT (0 / 1 = Ja / Nein)
KFZMARKE = VARCHAR(50)

Dann kannst du einfach abfragen:
Code:
SELECT X FROM Y
WHERE LAND = 'Deutschland'
AND PRIVAT = 1
AND KFZMARKE = 'BMW'
Die vorhandenen Daten musst du dann natürlich irgendwie konvertieren...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Basic-Frage

  Alt 13. Feb 2013, 13:35
Ich würde eher für Länder, Automarken etc. jeweils eine eigene Tabelle anlegen und die Fremdschlüssel darauf dann in jeweils einem Feld speichern. Deshalb ja mein Link.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
454 Beiträge
 
Delphi XE4 Professional
 
#5

AW: Basic-Frage

  Alt 13. Feb 2013, 13:37
Danke für die Hinweise ...

Zusatzfrage: .. gibts irgendwie eine Art "binäre Lösung" ?

Code:
Feld1  = Vorname
Feld2  = Nachname
Feld3  = Strasse
..
Feld20 = 00000000000000100000000001000000011110000000001

und dafür eine schnelle SQL Abfrage?

Vielen Dank
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von rapante
rapante

Registriert seit: 3. Jun 2009
Ort: OPR
171 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Basic-Frage

  Alt 13. Feb 2013, 13:40
Hy,
das Zauberwort heisst hier wohl Normalisierung:
Code:
tbl_person
 id
 name
 etc.

tbl_merkmal
 id
 name

tbl_person2merkmal
 id
 id_person
 idmerkmal
SQL:
Code:
SELECT * FROM tbl_person
INNER JOIN tbl_person2merkmal ON tblperson.id = tbl_person2merkmal.id_person
INNER JOIN tbl_merkmal ON tbl_person2merkmal.id_merkmal = tbl_merkmal.id
WHERE tbl_merkmal.name = 'BMW'
...so viele rote Kästen...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Basic-Frage

  Alt 13. Feb 2013, 13:42
As I said before

@erich.wanker: Was genau meinst Du mit "binärer Lösung"? Was soll im Feld stehen und wie soll das ausgewertet werden?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
454 Beiträge
 
Delphi XE4 Professional
 
#8

AW: Basic-Frage

  Alt 13. Feb 2013, 13:58
Kleines Beispiel:

Code:
SELECT FIRST 300 SKIP 0 * 
FROM DETAIL_DB INNER JOIN KEY_DB ON KEY_DB.INR_OWN = DETAIL_DB.INR

AND KEY_DB.INR_PARENT = 92321 
AND KEY_DB.INR_MENU = 3 AND DETAIL_DB.ERLEDIGT = 0 
AND DETAIL_DB.PERMISSION_FOR_VIEW CONTAINING'a'

AND DETAIL_DB.STATUS_INFORMATION NOT CONTAINING'd1'
AND DETAIL_DB.STATUS_INFORMATION NOT CONTAINING 'z9'
AND DETAIL_DB.STATUS_INFORMATION NOT CONTAINING 'x1'
AND DETAIL_DB.STATUS_INFORMATION CONTAINING 'a1'
AND DETAIL_DB.STATUS_INFORMATION CONTAINING 'b1'

ORDER BY DETAIL_DB.DATE2 ASCENDING, DETAIL_DB.OBJECT_NAME

Das Feld DETAIL_DB.STATUS_INFORMATION ist das besagte "Stringkategorisierungsding"


Cool wäre es wenn ich auf INNER JOIN verzichten könnte, weil ich im Vorfeld schon einige brauche.

Meine binäre Vorstellung wäre:

Code:
Ein Feld hat Wert: 0000000000000000000000000100000100010000011111
und eine Abfrage wäre lt. meiner Phantasie:

Code:
Select X from Y where Feld = "xxxxxxxxxxxx0xxxxx1xxxxx0xxxxxxxxxxxxx11"
and Feld NOT "xxxxxxxxxxxxxxxxxxxxxxxx1xxxxxxxxxxxxxxxxx"
x = egal was auf dieser Position steht

ich hoffe, ich hab mich halbwegs verständlich ausgedrückt

Danke
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Basic-Frage

  Alt 13. Feb 2013, 14:07
Sollen das jetzt Zahlen sein oder Strings? Das Hauptproblem bleibt doch: Deine Daten sind nicht atomar, da stehen mehrere Werte in einem einzigen Feld. IMO bringt es wenig bis nichts, einen Designfehler durch "krumme Tricks" wie Binärvergleiche ausbügeln zu wollen. Und ob Du nun einen INNER JOIN hast oder 20, welche Rolle spielt das? Sollte Dir das zu unübersichtlich werden, erstelle Dir doch eine Sicht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jobo

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

AW: Basic-Frage

  Alt 13. Feb 2013, 14:33
Die schnellste und variabelste Lösung wäre m.E. die von Rapante:
http://www.delphipraxis.net/1203324-post6.html

Eine Binär Lösung würde m.E. an der Einschränkung der Zahlentypen leiden, ok schnell, aber untypisch für SQL und in vielen SQL Dialekten wg der notewendigen Binär Operatoren auch nicht ohne weiteres umsetzbar.
(Vermutung: Die Darstellung hier ist zwar textuell, soll aber binär umgesetzt werden)
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:21 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