AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Designfrage - Tabellenlayout
Thema durchsuchen
Ansicht
Themen-Optionen

Designfrage - Tabellenlayout

Ein Thema von fkerber · begonnen am 22. Nov 2009 · letzter Beitrag vom 23. Nov 2009
Antwort Antwort
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

Designfrage - Tabellenlayout

  Alt 22. Nov 2009, 10:07
Datenbank: MySQL • Version: 5 • Zugriff über: php --> mysqli
Hi!

Es geht um ein grundsätzliches Design-Problem für eine Datenbank. Ich versuche mal kurz den momentan Aufbau zu umreißen - vllt. ist dieser schon der bestmögliche, vielleicht aber auch nicht:
Es gibt in dem System Schüler und Lehrer. Für jeden gibt es momentan eine Tabelle - diese sind recht ähnlich, d.h. es gibt 10 gemeinsame Attribute und jeweils ein Attribut, das die andere "Gruppe" nicht hat.
In vielen anderen Tabellen können an gleicher Stelle Schüler oder Lehrer auftauchen, d.h. zum Beispiel der Verfasser einer Nachricht kann ein Schüler oder ein Lehrer gewesen sein. In dieser Nachrichten-Tabelle (und vielen anderen) ist es so gelöst, dass man als Verfasser z.B. "S4711" oder "L1337" drin stehen hat.
Wenn es dann darum geht den Namen des Verfassers zu ermitteln, wird über das erste Zeichen geswitched und abhängig davon entweder aus der Schüler-Tabelle gefetched oder aus der Lehrertabelle.

Die einzige Alternative, die mir jetzt einfällt wäre die folgende:
Alle "Teilnehmer" sind in einer Tabelle mit insgesamt 12 oder 13 Attributen - 12 wenn ich einfach die 10+2*1 nehme und das Vorhandensein des 11. bzw. 12. Wertes als Flag benutze - 13 wenn ich noch ein "ist-Lehrer-Flag" benutzen würde.
Dann hätte ich eine "global" eindeutige Teilnehmer-ID. Im Gegenzug dazu fange ich mir einige tausend NULL-Einträge in der Datenbank ein und die DB-Abfragen werden etwas komplizierter (dafür entfällt vorher der PHP-Aufwand).

Jetzt meine Frage:
Ist Variante 1 besser oder Variante 2?
Oder gibt es gar eine noch bessere Variante 3, die ich noch nicht sehe/kenne?

Danke und liebe Grüße,
Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Designfrage - Tabellenlayout

  Alt 22. Nov 2009, 10:22
Hi Frederic,

ganz habe ich es nicht nachvollzogen, aber ich persönlich würde es wohl so lösen:

- Eine Tabelle für alle Personen
Dann hast du, wie du geschrieben hast, eine eindeutige ID und diese ist zusätzlich eine Zahl

- Die Tabelle enthält ein RechteFlag, bsp "istLehrer" vom Typ "bool".

- Extra Tabelle für die Lehrer mit den Spalten "ID" und "Feld, das die Schüler nicht haben".
Dann kannst du jeder Lehrer-ID dort die zusätzlichen Daten hinterlegen.

Das erspart dir Null-Felder und durch JOIN bekommst du deine Daten recht gut zusammen. Vielleicht geht's auch schöner. Ich würde es spontan so lösen, da es imho alles sauber getrennt ist.
Falls du das oben eh gemeint hast, ignoriere meinen Beitrag bzw. siehe ihn als Bestätigung. *g*

Grüße, Matze
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Designfrage - Tabellenlayout

  Alt 23. Nov 2009, 07:12
Ich würd die Tabellen im Prinzip so aufbauen.

T_Personen <- T_Lehrer (ID_Person + Felder für Lehrer)
<- T_Schüler (ID_Person + Felder für Schüler)

Die Personen werden, abhängig von ihrer Rolle, zusätzlich mit ID in den entsprechenden Tabellen eingetragen.
In den Rollentabellen jeweils PK und FK zu T_Personen auf ID_Person.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

Re: Designfrage - Tabellenlayout

  Alt 23. Nov 2009, 09:49
Hallo,

schau Dir mal bei Wikipedia den Artikel zur Normalisierung von Datenbanken an: http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
Der hilft Dir da bestimmt bei den grundlegenden Überlegungen weiter.

Mein "grobes" Vorgehen ist folgendes:

Alles was an gemeinsamen Attributen vorhanden ist, in eine Tabelle, alles spezielle in entsprechende Tabellen, die nur die jeweiligen "Spezialattribute" enthalten und per Fremdschlüssel auf die gemeinsame Tabelle verweisen. Dies lässt sich beliebig in eine Baumstruktur aufteilen, da eine Spezialisierung von Spezialtabellen ebenfalls möglich ist.

Im Beispiel:

Alle Schüler und Lehrer haben gemeinsam eine Anschrift und die Kennung, von welchen Type (sprich Schüler oder Lehrer) sie sind -> eine Tabelle.
Lehrer haben von mir aus noch Attribute für Fächer und Ausbildung -> eine Tabelle für Fächer, eine Tabelle für Ausbildung.
Schüler haben eine Schulform (Grundschüler, Hauptschüler, Gesamtschüler, Realschüler, Gymnasiasten, beliebige berufsbildende Schulformen... -> eine Tabelle. Die schülerbezogenen Besonderheiten dieser Schulformen könnte man nun in weitere Tabellen aufteilen, sofern sie nicht für alle Schulformen identisch sind.

Spart das "mitschleppen" von Attributen, die nur teilweise genutzt werden und ist per SQL und Joins hervorragen, aufgabenspezifisch zu selektieren. Steckt man alles in eine Tabelle, so wird die (früher oder später) unüberschaubar breit (sprich: enthält Unmengen von Attributen, die nur jeweils in geringem Umfang genutzt werden).
  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 15:59 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