Martin Fleck: Tabellen-Design / Query vereinfachen

Beitrag lesen

hallo Ihr,

ich entwickle gerade an einer Statistik-Applikation und habe mich dabei für die folgende Struktur der Tabellen entschieden. Im Backend wird zudem eine PostgreSQL-Datenbank verwendet.

Die Tabelle "property" enthält alle gängigen Eigenschaften eines Browsers.

Die Werte der entsprechenden Eigenschaften werden in "value" hinzugefügt, hierbei gibt es keine doppelten Datensätze! Vor dem Einfügen wird geprüft, ob der Wert bereits in der Tabelle vorhanden ist:
 -> wenn ja, wird die entsprechende id geschickt
 -> wenn nein, wird der neue Wert hinzugefügt und der aktuelle Index der Sequenz zurückgegeben

Die Verbindung zwischen dem jeweiligen Benutzer, der Eigenschaften und der Werte wird in "content" hergestellt.

property
--------
id  name
1   UserAgent
2   RemoteAddr
3   ScreenWidth
4   ScreenHeight

value
-----
id  data
3   IE
4   127.0.0.1

content
-------
value_id  property_id  user_id
1         3            1
2         4            1

Weiterhin möchte ich die Anzahl der User ermitteln, bei denen UserAgent="IE" und RemoteAddr="127.0.0.1" existiert. Dafür nutze ich derzeit den unten stehenden Query, allerdings scheint mir dieser doch noch sehr riesig zu sein:

select  count(distinct(content.user_id))
  from  config.property as property,
        data.value as value,
        data.content as content
 where  content.value_id = value.id
   and  content.property_id = property.id
   and  (
            select  count(distinct(content.user_id))
              from  config.property as property,
                    data.value as value,
                    data.content as content
             where  content.value_id = value.id
               and  content.property_id = property.id
               and  property.name = 'userAgent'
               and  value.data = 'IE'
        ) > 0
   and  (
            select  count(distinct(content.user_id))
              from  config.property as property,
                    data.value as value,
                    data.content as content
             where  content.value_id = value.id
               and  content.property_id = property.id
               and  property.name = 'remoteAddr'
               and  value.data = '127.0.0.1'
        ) > 0

  • Was haltet Ihr von der Aufteilung der Tabellen?
  • Kann man den Query vereinfachen?

Über ein paar nette Tipps würde ich mich sehr freuen! Danke.

Bis dahin,
Martin