Mailinglisten-Archive |
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