Abfrage überdynamische Felder
Abfrage überdynamische Felder
am 24.10.2006 16:39:09 von Frank Buss
Bei einer Anwendung gibt es eine User Tabelle mit festen Feldern:
create table user (
id int auto_increment,
userName varchar(255),
....
primary key (id));
Zusätzlich soll jedem User-Datensatz eine beliebige Anzahl Felder
zugeordnet werden können. Einige Felder werden wohl bei allen Usern
vorkommen, aber einige User können auch andere Felder haben. Ich habe mir
dazu überlegt, das so zu machen:
create table userData (
id int auto_increment,
userId int,
type int,
name varchar(255),
textValue mediumtext,
intValue int,
primary key (id),
fulltext (textValue));
Dabei legt dann "type" fest, ob das Feld intValue oder textValue gültig
ist. "name" ist der Feldnamen. Ggf. sollte man das in zwei getrennten
Tabellen auslagern, also eine für int-Values und eine für text-Values?
Problem ist aber jetzt eine Abfrage darauf: Ich will z.B. alle User
anzeigen, die ein int-Feld mit dem Namen "Foo" haben, dessen Wert innerhalb
der Grenzen a und b liegt UND die ein text-Feld mit dem Namen "Bar" haben,
das den String "baz" enthält. Das soll auf beliebig viele UND-verknüpfte
Felder ausgeweitet werden können. Wie geht das?
--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Re: Abfrage über dynamische Felder
am 25.10.2006 08:08:51 von Werner Bauer
Frank Buss schrieb:
> Bei einer Anwendung gibt es eine User Tabelle mit festen Feldern:
>=20
> create table user (...
> create table userData (...
> id int auto_increment,
> userId int,
> type int,
> name varchar(255),
> textValue mediumtext,
> intValue int,
> primary key (id),
> fulltext (textValue));
>=20
> Dabei legt dann "type" fest, ob das Feld intValue oder textValue gült=
ig
> ist. "name" ist der Feldnamen. Ggf. sollte man das in zwei getrennten
> Tabellen auslagern, also eine für int-Values und eine für text-Valu=
es?
>=20
> Problem ist aber jetzt eine Abfrage darauf: Ich will z.B. alle User
> anzeigen, die ein int-Feld mit dem Namen "Foo" haben, dessen Wert inner=
halb
> der Grenzen a und b liegt UND die ein text-Feld mit dem Namen "Bar" hab=
en,
> das den String "baz" enthält. Das soll auf beliebig viele UND-verknü=
pfte
> Felder ausgeweitet werden können. Wie geht das?
select u.*
from user
join userData as haveFoo on haveFoo.userId=3Duser.id
join userData as haveBar on haveBar.userId=3Duser.id
where
haveFoo.irgendwas ...
and haveBar.irgendwas ....
AFAIK kannst du die where Angaben genausogut in die on clause schreiben
je nachdem ob die Felder mehrfach vorkommen(können) musst du vielleicht=
=20
noch auf Eindeutigkeit der user.* Daten achten.
Werner.
Re: Abfrage über dynamische Felder
am 30.10.2006 14:30:35 von Frank Buss
werner bauer wrote:
> select u.*
> from user
> join userData as haveFoo on haveFoo.userId=user.id
> join userData as haveBar on haveBar.userId=user.id
> where
> haveFoo.irgendwas ...
> and haveBar.irgendwas ....
Danke, funktioniert. Ich frage mich aber, wenn da viele Daten in den
Tabellen sind, ob das schnell genug ist?
--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Re: Abfrage über dynamische Felder
am 30.10.2006 15:20:09 von Claus Reibenstein
Frank Buss schrieb:
> Danke, funktioniert. Ich frage mich aber, wenn da viele Daten in den
> Tabellen sind, ob das schnell genug ist?
Was verstehst Du unter "viele Daten"?
Wenn Du Deine Tabellen korrekt indizierst, sollte das kein Problem sein,
auch wenn die Anzahl der Datensätze in die Millionen geht.
Gruß. Claus
Re: Abfrage über dynamische Felder
am 31.10.2006 13:57:33 von Frank Buss
Claus Reibenstein wrote:
> Wenn Du Deine Tabellen korrekt indizierst, sollte das kein Problem sein,
> auch wenn die Anzahl der Datensätze in die Millionen geht.
Wenn's gut läuft, dann können es schon ein paar Millionen werden und dazu
noch ein paar tausend Abfragen pro Sekunde, aber dann melde ich mich
nochmal, wenn ich Hilfe beim Clustering o.ä. brauche :-)
--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de