AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Separate Tabellen mit indizierten Spalten???
Thema durchsuchen
Ansicht
Themen-Optionen

Separate Tabellen mit indizierten Spalten???

Ein Thema von romber · begonnen am 10. Sep 2011 · letzter Beitrag vom 10. Sep 2011
Antwort Antwort
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 13:28
Datenbank: MS SQL Server • Version: 2008 • Zugriff über: UniDAC, ADO
Hallo!

Ich habe von einem Bekannten gerade einen Tipp bekommen, im Rahmen der Normalisierung jede indizierte Spalte in eine separate Tabelle auszulagern, Indizieren und 1:n mit der Haupttabelle verknüpfen. Diese Aktion soll bei großen Tabellen angeblich enormen Performance-Schub leisten, besonders wenn es für den künftigen Abfragen nicht immer alle indizierte Spalten einezogen werden. So habe ich es verstanden. Ist was dran? Sollte man das wirklic machen?

Geändert von romber (10. Sep 2011 um 13:32 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 14:09
In der Praxis muss man genau Ausloten in wiefern eine Normalisierung Sinn macht.
Die Theorie sagt ja, dass jedes Feld, dass nicht vom Schlüssel sondern von einem anderen Feld abhängt normalisiert werden muss. In der Praxis hängt es davon ab ob es bei Abfragen benötigt wird.

Nach der Theorie müsste ein Ort ausgelagert werden, da er ja vollständig von der PLZ abhängt, diese wird aber selten ohne den Ort benötigt, so dass in einer Abfrage nun ein "teuere" Join notwendig wird.
Markus Kinzler
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 15:22
Brrr..., habe nicht ganz verstanden.
Ich habe hier z.B. eine Tabelle mit den Ersatzteilen für die Landmaschienen. Da habe ich zwei Felder "Typ" und "Bauart", beide werden gelegentlich für die Suche verwendet. Bauart hängt immer vom Typ ab. Ein Index fasst beide Felder zusammen. Soll ich etwa diese beide Felder in eine separate Tabelle auslagern?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 15:35
Bauart hängt immer vom Typ ab.
In den Fall sollte man eine Tabelle "LandMaschinenTyp" haben, bei dem der Typ der Primärschlüssel ist:

Code:
IdTyp | Beschreibung | Bauart
====================================
    A | Traktor      | Allradantrieb
    B | Traktor      | Heckantrieb
    C | Vollernter   | Allradantrieb
Also ich habe kein Detailwissen über Landmaschinen, sodass die Beispieleinträge hier rein fiktiv sind.
Aber ich denke das Prinzip sollte klar werden.
In deiner Tabelle mit den Landmaschinen verweisst du mit einem Fremdschlüssel nur auf den Typ.
Damit ist die Bauart automatisch über die Tabelle "LandMaschinenTyp" festgelegt.
Du kannst auch die Bauart über eine weitere Tabelle auslagern:
Code:
Tabelle "LandMaschinenTyp
IdTyp | Beschreibung | IdBauart
====================================
    A | Traktor      | 1
    B | Traktor      | 2
    C | Vollernter   | 1



Tabelle "Bauart"
IdBauart | Beschreibung
=======================
       1 | Allradantrieb
       2 | Heckantrieb
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 15:45
Zitat:
Brrr..., habe nicht ganz verstanden.
In der Theorie müsste man PLZ und Ort in eine eigene Tabelle auslagern, da der Ort vollständig von der PLZ abhängt. Da man in der Praxis in den meisten Fällen den Ort zusätzlich benötigt ist die Normalisierung in diesem Fall kontraproduktiv.
Markus Kinzler
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#6

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 17:04
Hallo!

Ich habe von einem Bekannten gerade einen Tipp bekommen...Diese Aktion soll bei großen Tabellen angeblich enormen Performance-Schub leisten
Nein! Die schnellste Datenbank ist die, die überhaupt keine Verknüpfungen hat, d.h. nur aus einer einzigen Tabelle besteht.

Wobei ich mit 'Datenbank' hier eher 'Information' meine, also z.B. 'Lagerbestand', 'Kundenaufträge' usw.

Stichwort: Data Warehouse.

Mit normalisierten Datenbanken spart man Speicherplatz, weil man Redundanz vermeidet.

I.A. ist die Architektur so, das man für laufende Prozesse (offene Aufträge, aktuelle Produktionsdaten usw) eine normalisierte Tabelle verwendet und für die Statistiken ein Datastore / Datawarehouse, also alles in eine Tabelle stopft. Einige wenige Daten dürfen dann in einer Lookuptabelle sein, z.B. Datumsinformationen (Datum, Tag, Monat, Quartal, Jahr, Wochentag usw.)
Das Bild hängt schief.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 17:32
Zitat:
Nein! Die schnellste Datenbank ist die, die überhaupt keine Verknüpfungen hat, d.h. nur aus einer einzigen Tabelle besteht.
Wenn man alle Informationen benötigt.
Zudem ist es wenig klug, Redundanzen zu zu erzeugen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 18:11
Das die Abfrage eine Datenmenge einer Tabelle mit wenigen Felder evtl. schneller ist sieht wie ein Vorteil aus. Bei einer stark normalisierten Form stehen dem als Nachteil aber die vielen benötigten JOIN entgegen. Bei den heutigen hochoptimierten (und teilweise sich selbst optimierenden) Datenbanken kann man den richtigen Mittelweg nur durch Ausprobieren und Performancemessungen herausfinden. Wichtig ist auch der Performance-Schwerpunkt, ist diese bei INSERT, SELECT, UPDATE oder überall wichtig?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#9

AW: Separate Tabellen mit indizierten Spalten???

  Alt 10. Sep 2011, 18:24
Vielen Dank für diese hilfreiche Antworten! Ich fange langsam an, das ganze zu verstehen. Falls eine oder andere Anfängerfrage euch, den Profis, doof vorkommt, so bitte ich vorab um Verzeihung.

In den Fall sollte man eine Tabelle "LandMaschinenTyp" haben, bei dem der Typ der Primärschlüssel ist
Ist Primärschlüssel nicht eindeutig? Ich meine, es werden doch immer wieder die gleichen Typen der Tabelle hinzugefügt.

In der Theorie müsste man PLZ und Ort in eine eigene Tabelle auslagern, da der Ort vollständig von der PLZ abhängt. Da man in der Praxis in den meisten Fällen den Ort zusätzlich benötigt ist die Normalisierung in diesem Fall kontraproduktiv.
In meiner Tabelle gibts es praktisch nur zwei Abhängigkeiten:
- "Bauart" hängt vom "Typ" ab. In 70% aller Abfragen braucht man davon nur den Typ.
- "Baujahr-Monat" von "Baujahr-Jahr". Auch hier braucht man in der Regel nur das Jahr.

Alle anderen Felder haben keine Abhängigkeiten voneinander. Es gibt auch keine vorgebenen Abfragemuster. Der Benutzer hat eine Suchmaske und kann die Parameter beliebig auswählen. Die Parameter entsprechen den Tabellenfeldern. Die Ausnahmen sind eben diese viel o.g. Parameter. Um Bauart auszuwählen, muss der Benutzer zuerst den Typ wählen, genau so bei Monat und Jahr. Ansonsten frei Wahl der Suchlarameter. Ich möchte bei den Abragen die bestmögliche Performance erreichen.

Wichtig ist auch der Performance-Schwerpunkt, ist diese bei INSERT, SELECT, UPDATE oder überall wichtig?
INSERT und UPDATE sind egal, SELECT ist das wichtigste.

Was würdet Ihr mir empfehlen? Soll ich die Felder auslagern oder nicht?

Geändert von romber (10. Sep 2011 um 18:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:33 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