php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 01.12.2006, 22:12  
Erfahrener Benutzer
 
Registriert seit: 28.06.2008
Beiträge: 257
maeck befindet sich auf einem aufstrebenden Ast
Standard Normalisierung einer chaotischen Tabelle

Hallo,

ich habe zwei Tabellen für eine Veranstaltung übernommen, die ich am Überarbeiten bin. Eine Tabelle hat die Einzelpersonen gespeichert, die andere die Familien (mit allen Familienmitgliedern).

Erst mal zu den Familien (schonmal sorry für den vielen Code):
Hier der Ursprungscode der zu überarbeitenden Tabelle:
Code:
  `id` int(4) NOT NULL auto_increment,
  `anmdatum` date NOT NULL default '0000-00-00',
  `nachname` varchar(100) NOT NULL default '',
  `vorname_mann` varchar(100) NOT NULL default '',
  `gebdatum_mann` date NOT NULL default '0000-00-00',
  `vorname_frau` varchar(100) NOT NULL default '',
  `gebdatum_frau` date NOT NULL default '0000-00-00',
  `strasse` varchar(100) NOT NULL default '',
  `land` varchar(50) NOT NULL default '',
  `plz` varchar(10) NOT NULL default '',
  `ort` varchar(30) NOT NULL default '',
  `telefon` varchar(25) NOT NULL default '',
  `fax` varchar(25) NOT NULL default '',
  `email` varchar(100) NOT NULL default '',
  `vorname_kind1` varchar(100) NOT NULL default '',
  `gebdatum_kind1` date NOT NULL default '0000-00-00',
  `vorname_kind2` varchar(100) NOT NULL default '',
  `teenieforum_kind2` tinyint(1) NOT NULL default '0',
  `gebdatum_kind3` date NOT NULL default '0000-00-00',
  `vorname_kind4` varchar(100) NOT NULL default '',
  `gebdatum_kind4` date NOT NULL default '0000-00-00',
  `uebernachtunghotel_erwachsene` tinyint(1) NOT NULL default '0',
  `uebernachtunghotel_kinder` tinyint(1) NOT NULL default '0',
  `uebernachtungturnhalle_erwachsene` tinyint(1) NOT NULL default '0',
  `uebernachtungturnhalle_kinder` tinyint(1) NOT NULL default '0',
  `uebernachtunggastfamilie_erwachsene` tinyint(1) NOT NULL default '0',
  `uebernachtunggastfamilie_kinder` tinyint(1) NOT NULL default '0',
  `uebernachtungcamping_erwachsene` tinyint(1) NOT NULL default '0',
  `uebernachtungcamping_kinder` tinyint(1) NOT NULL default '0',
  `uebernachtungjugendgaestehaus` tinyint(1) NOT NULL default '0',
  `mittagabendessen_erwachsene` tinyint(1) NOT NULL default '0',
  `mittagabendessen_kinder` tinyint(1) NOT NULL default '0',
  `fruehstueck_erwachsene` tinyint(1) NOT NULL default '0',
  `fruehstueck_kinder` tinyint(1) NOT NULL default '0',
  `betrag_tagungsgebuehr` varchar(5) NOT NULL default '',
  `betrag_uebernachtung` varchar(5) NOT NULL default '',
  `betrag_essen` varchar(5) NOT NULL default '',
  `solidaritaetsbeitrag` varchar(5) NOT NULL default '',
  `rabatt` tinyint(1) NOT NULL default '0',
  `gesamt_rabatt` varchar(5) NOT NULL default '',
  `weitere_kosten` varchar(5) NOT NULL default '',
  `betrag_gesamt` varchar(5) NOT NULL default '',
  `anm_online` tinyint(1) NOT NULL default '0',
  `firsttime` tinyint(1) NOT NULL default '0',
  `attendance_free` tinyint(1) default NULL,
  `transfer` tinyint(1) default '0',
  `transfer_date` date NOT NULL default '0000-00-00',
  `anmerkungen` text NOT NULL,
Diese habe ich nun unterteilt (normalisiert) in folgende Tabellen:
Familie
Code:
  `id` int(4) NOT NULL auto_increment,
  `pid` int(4) NOT NULL,
  `anmdatum` date NOT NULL default '0000-00-00',
  `nachname` varchar(100) NOT NULL default '',
  `strasse` varchar(100) NOT NULL default '',
  `land` varchar(50) NOT NULL default '',
  `plz` varchar(10) NOT NULL default '',
  `ort` varchar(30) NOT NULL default '',
  `telefon` varchar(25) NOT NULL default '',
  `fax` varchar(25) NOT NULL default '',
  `email` varchar(100) NOT NULL default '',
  `betrag_tagungsgebuehr` varchar(5) NOT NULL default '',
  `betrag_uebernachtung` varchar(5) NOT NULL default '',
  `betrag_essen` varchar(5) NOT NULL default '',
  `solidaritaetsbeitrag` varchar(5) NOT NULL default '',
  `rabatt` tinyint(1) NOT NULL default '0',
  `gesamt_rabatt` varchar(5) NOT NULL default '',
  `weitere_kosten` varchar(5) NOT NULL default '',
  `betrag_gesamt` varchar(5) NOT NULL default '',
  `anm_online` tinyint(1) NOT NULL default '0',
  `firsttime` tinyint(1) NOT NULL default '0',
  `attendance_free` tinyint(1) default NULL,
  `transfer` tinyint(1) default '0',
  `transfer_date` date NOT NULL default '0000-00-00',
  `anmerkungen` text NOT NULL,
Familienmitglieder
Code:
  `pid` int(4) NOT NULL,#
  `vorname` varchar(100) NOT NULL default '',
  `geschlecht` tinyint(1) NOT NULL default '0',  
  `gebdatum` date NOT NULL default '0000-00-00', 
  `unterkunftid` tinyint(1) NOT NULL default '0',
  `essenid` tinyint(1) NOT NULL default '0',
  `forumid` tinyint(1) NOT NULL default '0',
Unterkunft
Code:
  `unterkunftid` tinyint(1) NOT NULL default '0',
  `unterkunft` tinyint(20) NOT NULL default '0',
Essen
Code:
  `essenid` tinyint(1) NOT NULL default '0',
  `essen` tinyint(20) NOT NULL default '0',
Forum
Code:
  `forumid` tinyint(1) NOT NULL default '0',
  `forum` tinyint(20) NOT NULL default '0',
Meine Frage ist nun, ist die Aufteilung richtig, oder kann man was besser machen?

Muss man eine extra Tabelle für Unterkunft machen, obwohl nur 4 Einträge darin sind, die sich auch nicht ändern. Ebenfalls bei dem Essen (dort gibts nur zwei Einträge, die sich nicht ändern werden).
Oder macht man in diesem Fall keine weitere Tabelle sondern schreibt es direkt in die Tabelle Familienmitglieder?


Nun die Ursprungs-Tabelle Einzelpersonen:
Code:
  `id` int(4) NOT NULL auto_increment,
  `datum` date NOT NULL default '0000-00-00',
  `nachname` varchar(100) NOT NULL default '',
  `vorname` varchar(100) NOT NULL default '',
  `geschlecht` char(1) NOT NULL default '',
  `gebdatum` date NOT NULL default '0000-00-00',
  `strasse` varchar(100) NOT NULL default '',
  `land` varchar(50) NOT NULL default '',
  `plz` varchar(10) NOT NULL default '',
  `ort` varchar(30) NOT NULL default '',
  `telefon` varchar(25) NOT NULL default '',
  `fax` varchar(20) NOT NULL default '',
  `email` varchar(100) NOT NULL default '',
  `lebensform` varchar(20) NOT NULL default '',
  `uebernachtung` varchar(20) NOT NULL default '0',
  `essen` tinyint(1) NOT NULL default '0',
  `soli` varchar(5) NOT NULL default '',
  `rabatt` varchar(5) NOT NULL default '0',
  `gesamt_rabatt` varchar(5) NOT NULL default '',
  `weitere_kosten` varchar(5) NOT NULL default '',
  `gesamtbetrag` varchar(5) NOT NULL default '0',
  `anm_online` tinyint(1) NOT NULL default '0',
  `firsttime` tinyint(1) NOT NULL default '0',
  `anm_ab14` tinyint(1) NOT NULL default '0',
  `attendance_free` tinyint(1) default NULL,
  `transfer` tinyint(1) default '0',
  `transfer_date` date NOT NULL default '0000-00-00',
  `anmerkungen` text NOT NULL,
Kann ich die so lassen, oder soll ich sie mit der Familientabelle kombinieren?
Sind die Einstellungen (NULL / NOT NULL) richtig und sinnvoll?

Vielen Dank für eure Hilfe und nochmal sorry, für den vielen Code.
maeck ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.12.2006, 22:37  
Erfahrener Benutzer
 
Registriert seit: 28.06.2008
Beiträge: 257
maeck befindet sich auf einem aufstrebenden Ast
Standard

Ups, ich habe gerade gemerkt, dass ich es vielleicht besser ins MySQL-Forum gepostet hätte. Könnte ein Mod den Post bitte verschieben?

//Edit: Danke fürs Verschieben.
maeck ist offline   Mit Zitat antworten
Alt 04.12.2006, 15:12  
Erfahrener Benutzer
 
Registriert seit: 28.06.2008
Beiträge: 257
maeck befindet sich auf einem aufstrebenden Ast
Standard

Hat keiner eine Idee dazu oder ist es einfach zu viel Code?

Dann wäre es nett, wenn mich zumindest jemand über meine letzte Frage aufklären könnte
Zitat:
Muss man eine extra Tabelle für Unterkunft machen, obwohl nur 4 Einträge darin sind, die sich auch nicht ändern. Ebenfalls bei dem Essen (dort gibts nur zwei Einträge, die sich nicht ändern werden).
Oder macht man in diesem Fall keine weitere Tabelle sondern schreibt es direkt in die Tabelle Familienmitglieder?
maeck ist offline   Mit Zitat antworten
Alt 04.12.2006, 16:34  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Werd nur ma auf deine letzte Frage eingehen, für den Rest müsst ich mir erstmal etwas Zeit nehmen.

Ich würd trotz der grad mal 4 Einträge ebenfalls eine kleine Tabelle anlegen. Ansonsten könntest du die 4 Einträge auch "hardcoden", also direkt in den PHP-Code einsetzen, is aber ne sehr hässliche Sache
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 04.12.2006, 17:26  
Erfahrener Benutzer
 
Registriert seit: 28.06.2008
Beiträge: 257
maeck befindet sich auf einem aufstrebenden Ast
Standard

Hallo KingCrunch,
danke für deine Antwort.

OKay aber warum macht man das? Gibt es eine bessere Performance, bei zusätzlicher Tabelle (klingt doch irgendwie unlogisch, oder)?

Mal angenommen ich mach die extra Unterkunftstabelle, wo ne ID und die Unterkunft selbst drin ist. Dann muss ich bei den Personen die UnterkunftsID mit reinnehmen, die dann auf die Tabelle Unterkunft verweist. Ob ich also bei den Personen dann ne "1" eintrage oder "Hotel" ist doch eigentlich egal, oder?
Oder ist es einfach sauberer und man macht es deswegen?
maeck ist offline   Mit Zitat antworten
Alt 04.12.2006, 17:39  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

1. Jo, hast Recht, es ist sauberer. Du hast dadurch Daten gesammelt an einem Ort und nicht überall verstreut oder sogar ganz schlimm direkt im Code drin.
2. Man weiß nie, ob sich nicht doch irgendwas ändert Es können Datensätze hinzukommen, sich ändern, oder wegfallen.

Die Performance leidet sicherlich etwas darunter, aber das sollte nicht unbedingt ins Gewicht fallen.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 04.12.2006, 17:41  
Erfahrener Benutzer
 
Registriert seit: 28.06.2008
Beiträge: 257
maeck befindet sich auf einem aufstrebenden Ast
Standard

Okay, danke dir!

Hast du vielleicht auch noch nen Rat, ob ich die Familien mit den Einzelpersonen verwurschteln soll, oder die Einzelpersonen lieber so als Tabelle lassen soll, wie sie oben ist?
maeck ist offline   Mit Zitat antworten
Alt 12.12.2006, 14:54  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.244
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

alternativ könntest du auch einen ENUM() Datentyp für die Unterkunft / Essen Daten benutzen.
nikosch ist gerade online   Mit Zitat antworten
Alt 12.12.2006, 17:56  
Erfahrener Benutzer
 
Registriert seit: 28.06.2008
Beiträge: 257
maeck befindet sich auf einem aufstrebenden Ast
Standard

alternativ zu was?
und was ist ein ENUM-Datentyp?
maeck ist offline   Mit Zitat antworten
Alt 12.12.2006, 17:59  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

ENUMeration, Aufzählung.

Essen: ENUM('Frühstück', 'Brunch', 'Mittagessen', 'Lunch', 'Abendbrot')
Für die Spalte `Essen` wird beispielsweise nur einer dieser Strings akzeptiert. Dargestellt wird das ganze intern mit INT, ist deshalb also recht speicherschonend, schnell und trotzdem übersichtlich.
Zergling-new ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zeilenanzahl einer tabelle mit WHERE aber ohne schleife? sovereign Datenbanken 13 17.04.2006 20:34
[Erledigt] Problem mit dem Füllen einer Tabelle über Formular PHP Tipps 2006 18 10.01.2006 12:51
[Erledigt] Problem mit Anzeige einer Tabelle mit dem Firefox? HTML, Usability und Barrierefreiheit 8 28.11.2005 15:08
Tabelle aktualisieren Datenbanken 3 23.11.2005 09:54
Problem mit mySQL Datenbanken 7 27.09.2005 12:06
mysql abfrage über 4 Tabelle - bis 3 geht, bei der 4. habert Datenbanken 2 08.09.2005 11:59
tabelle in tabelle ohne aussenrand noskule HTML, Usability und Barrierefreiheit 6 25.08.2005 14:17
[Erledigt] Interne Tabelle (DB Tabelle in Array auslesen) PHP Tipps 2005 10 29.03.2005 17:08
[Erledigt] HTML Tabellenzeile in Tabelle einfügen? Datenbanken 2 28.01.2005 00:28
[Erledigt] Tabelle in Tabelle ausrichten HTML, Usability und Barrierefreiheit 7 03.01.2005 14:32
Auslesen mySQL tabelle und ausgabe als html Calli PHP Tipps 2004-2 3 21.12.2004 16:51
[Erledigt] Ganze Tabelle ausgeben PHP Tipps 2004-2 1 21.11.2004 16:48
[Erledigt] Tabelle in Tabelle automatisch anpassen HTML, Usability und Barrierefreiheit 3 04.11.2004 21:37
Sortieren anhand einer zweiten Tabelle PHP Tipps 2004 6 20.09.2004 09:03
[Erledigt] HILFE: Column count doesn't match value count at row 1 Datenbanken 17 12.06.2004 16:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
tabelle normalisierung, normalisierung von tabellen, normalisierung tabellen, normalisierung tabelle, phpmyadmin timestamp, standartnormalisierung, phpmyadmin normalisierung, datenbanken normalisierung tabellen, tabelle normalisieren, soli tabelle, automatisches normalisieren von tabellen, phpmyadmin normalisieren einer datenbank, datenbanken normalisierung ursprung, normalisierung auf 100, tinyint( 1 ) default \'0\', chaotische tabellen normalisieren, mysql tabelle normalisieren, per phpmyadmin eine tabelle normalisieren, varchar (100) ?, null eins normalisierung

Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.