phpbar.de logo

Mailinglisten-Archive

Was ist performanter varchar oder set?

Was ist performanter varchar oder set?

Martin Troeger mailinglists@troeger-online.net
Tue Nov 19 12:23:26 2002


Hallo Andreas,

On 19 Nov 2002 at 12:59, Andreas Kunert wrote:

> Beispiel:
> id,text,kat1,kat2,kat3,kat....
> 
> dabei sind die kat-Felder vom Typ varchar(255) und können diverse Zahlen
> enthalten in der Form kat1 = 1;25;17 kat2 = 3;7;10 etc...
> 
> Jetzt suche ich beispielsweise alle Datensätze die in kat1 1 und 17
> enthalten und in kat2 3 und 7
> 
> Momentan über eine Abfrage in ungefähr der Form:
> SELECT id,text
> FROM tabelle
> WHERE
> ( kat1 regexp '(^|;)1(;|\$)' OR kat1 regexp '(^|;)17(;|\$)' )
> AND
> ( kat2 regexp '(^|;)3(;|\$)' OR kat2 regexp '(^|;)7(;|\$)' )
> 
> Irgendwie dauert das ganze bei ca. 5000 Datensätzen ziemlich lange.

über die Performance kann ich keine definitiven Aussagen treffen. Aber 
grundsätzlich solltest du dein Design überdenken. Eine Kernregel im 
relationalen Datenbankentwurf beschreibt die Atomarität von Attributen. 

Eine Liste in einem Varchar-Feld ist nicht atomar. Hier gibt es zwei 
Möglichkeiten, dieses Problem zu lösen. Entweder normalisierst du deine 

Struktur, in dem du für jedes Feld kat* eine eigene Tabelle anlegst 
oder du tatsächlich einen Feldtyp set nutzt. Der Feldtyp set bietet 
dahingehend Vorteile, dass du auf einfache Art und Weise festlegen 
kannst, welche Werte überhaupt eingetragen werden dürfen und dass die 
Abfragen, Updates und Inserts simpler sind. Sollten aber später noch 
weitere kat* dazukommen, ist das Anlegen einer zusätzlichen Tabelle 
wahrscheinlich einfacher.

Ich persönlich würde zusätzliche Tabellen anlegen. Ich weiß jetzt 
nicht, ob der Feldtyp set SQL-Standard ist. Aber bei einer Portierung 
auf eine andere Datenbank könntest du damit in Schwierigkeiten kommen.

Gruß, Martin

-- 
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->>  http://www.4t2.com/mysql 


php::bar PHP Wiki   -   Listenarchive