php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.02.2010, 10:22  
Benutzer
 
Registriert seit: 19.01.2009
Beiträge: 31
Floid befindet sich auf einem aufstrebenden Ast
Standard 1:1 Beziehung Sinnvoll - Auslagerung ? MySQL

Hallo Community!

Ich frage mich schon seit einiger Zeit ob es Sinn macht Felder einer Tabelle welche man normalerweise nur sehr selten braucht oder nur in speziellen Abfragen relevant sind in eine weitere Tabelle auszulagern. Diese Tabelle stellt eine 1:1 Beziehung mit der ersten Tabelle dar.

z.B.

id user1_id user2_id status accepted_at rejected_at

friendship_id request_at request_text

Fett: Primary Key

Gibt es Fälle indem es Sinn macht ? GRUND dafür?

Danke schonmal für die Informationen!
Floid ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 11.02.2010, 10:37  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.233
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Das kommt immer drauf an, wo du bei der Normalisierung den Schnitt ansetzt. Ist ein Benutzer nur durch seinen Benutzernamen definiert? Gehört die ICQ-Adresse zum User direkt dazu oder ist das eine zusätzliche Entität?

Aus praktischen Gesichtspunkten ist das relativ unerheblich, solange du nicht mit SELECT * arbeitest, was natürlich bei ganz vielen Datenfeldern auch viele holt, duie du gar nicht brauchst in einer Abfrage. Je nach Datenbanksystem macht es jedoch aus Performance-Sicht Sinn, insbesondere TEXT und BLOB Felder auszulagern, da diese meist auch in der Datenbank eine variable Größe haben und somit beim Zugriff auf Datensätze eventuell die Performance verschlechtern, selbst wenn du sie nicht selektierst.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist gerade online   Mit Zitat antworten
Alt 11.02.2010, 11:19  
Benutzer
 
Registriert seit: 19.01.2009
Beiträge: 31
Floid befindet sich auf einem aufstrebenden Ast
Standard

Also ich verwende MySQL. und SELECT * verwende ich nicht.

Aber mein Anschlag hatte ich auch bei der Theorie mit der Performance oder Skalierbarkeit.

So hätte ich die wichtigsten ~10 Informationen welche ich an den User binden möchte in der User Tabelle direkt. Eine zweite Tabelle namens "user_about" z.b. könnte die grosse Menge an Zusatzfelder welche man wirklich nicht grad immer braucht auslagern.

Für alles andere gibt es ja noch den Innerjoin

So meine These. Ich frage jetzt genau wegen dem die Datenbank Experten hier!
Floid ist offline   Mit Zitat antworten
Alt 11.02.2010, 11:49  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.233
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Performance ist im Regelfall unerheblich bei konstanten Feldgrößen. Daher muss man die nicht zwangsläufig trennen. Auch eine Tabelle mit 40 Feldern bricht in der Performance nicht zwangsläufig ein, wenn die Felder selbst konstant groß sind (Ints, CHAR). Erst wenn Blobs und Texts hinzu kommen, wird manches DB-System langsamer. Ob spürbar oder nicht, kann ich dir nicht verraten. Auf jeden Fall brauchst du bei 40 oder 50 Feldern und 1000 Datensätzen solche Überlegungen auch nicht anstellen.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist gerade online   Mit Zitat antworten
Alt 11.02.2010, 11:58  
Benutzer
 
Registriert seit: 19.01.2009
Beiträge: 31
Floid befindet sich auf einem aufstrebenden Ast
Standard

okhei danke ich verstehe !

nun bei meinem obrigem beispiel ist es aber ja so das ein friendship_request nur einmal bei der freundschaftsanfrage benötigt wird. später werden felder wie request_at und request_text ja sowieso nie mehr benötigt.

wie siehts aus mit dem Grund ? könnte man schon gelten lassen oder
Floid ist offline   Mit Zitat antworten
Alt 11.02.2010, 12:25  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.233
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von mepeisen Beitrag anzeigen
Das kommt immer drauf an, wo du bei der Normalisierung den Schnitt ansetzt. Ist ein Benutzer nur durch seinen Benutzernamen definiert? Gehört die ICQ-Adresse zum User direkt dazu oder ist das eine zusätzliche Entität?
Es gibt keine eindeutige Antwort darauf.
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist gerade online   Mit Zitat antworten
Alt 14.03.2010, 16:26  
Benutzer
 
Registriert seit: 05.06.2009
Beiträge: 50
PHP-Kenntnisse:
Anfänger
rodger befindet sich auf einem aufstrebenden Ast
Standard

Hallo, genau diese Frage interessiert mich auch grade sehr. Auch genau die Situation, wenn man die Daten die man nun auslagern oder beibehalten will, nur an einer bestimmten Stelle braucht. Ich denke mir, das es ja eigentlich nicht schaden kann, das dann auszulagern, bzw es schadet ja auch der Installation nicht wirklich, wenn nun eine zusätzliche Tabelle vorhanden ist, denke ich mir jedenfalls mal. Ich würde sagen, meinem derzeitigen Kenntnisstand entsprechend tendiere ich eher dazu, die Felder - es sind drei Felder - auszulagern.

Gruß, Rodger
rodger ist offline   Mit Zitat antworten
Alt 15.03.2010, 06:37  
Erfahrener Benutzer
 
Registriert seit: 09.03.2009
Beiträge: 145
PHP-Kenntnisse:
Fortgeschritten
jGeee befindet sich auf einem aufstrebenden Ast
Standard

Das hängt alles von sehr vielen faktoren ab. Ich selbst habe in einem großen Redaktionssystem (mittlerweile 12.000 Artikel) die Tabellen ebenfalls gesplittet, auch aus Performance gründen.

article_infos = Titel, PublishUpTimestamp, PublishDownTimestamp, Redakteurinfos, Views, usw.
article_content = Nur der Inhalt des Artikels
article_teaser = Nur die Teaser

Bei der Anzahl an Datensätzen, vorallem wegen der Größe der einzelnen Artikel, macht das imho schon sinn, jedoch hängt es nicht nur von der DB ab, auch Server inkl. der Hardware spielt ja zudem eine große Rolle...
jGeee ist offline   Mit Zitat antworten
Alt 19.03.2010, 12:23  
Benutzer
 
Registriert seit: 05.06.2009
Beiträge: 50
PHP-Kenntnisse:
Anfänger
rodger befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Bei der Anzahl an Datensätzen, vorallem wegen der Größe der einzelnen Artikel, macht das imho schon sinn, jedoch hängt es nicht nur von der DB ab, auch Server inkl. der Hardware spielt ja zudem eine große Rolle...
Was meinst du damit? meinst du das es Server gibt, bei denen es mehr sinn macht Felder in neue Tabellen auszulagern und Server bei denen es mit der gleichen Seite/software mehr sinn macht die Felder in einer größeren Tabelle zu behalten?

Gruß, Rodger
rodger ist offline   Mit Zitat antworten
Alt 19.03.2010, 14:47  
thomas_w
Gast
 
Beiträge: n/a
Standard

Vertikale Partitionierung von Tabellen kann schon sinnvoll sein, speziell wenn einige Spalten sehr häufig und
andere selten benötigt werden und/oder sehr groß sind (z.B. BLOB, TEXT etc.).

Eine Beispieltabelle, bei der Spalten die "oft" und "selten" verwendet werden, könnte so aussehen. Es existiert eine 1 zu 1 Verknüpfung des PRIMARY KEY.

Code:
CREATE TABLE tab_oft (
 tab_id,
 col01,
 col02,
 [...]
 PRIMARY KEY (tab_id)
)

CREATE TABLE tab_selten (
 tab_id,
 col21,
 col22,
 [...]
 PRIMARY KEY (tab_id),

 FOREIGN KEY ..
   ON DELETE CASCADE
)
Mit Hilfe einer VIEW kann dann (optional) eine Gesamttabelle nachgebildet werden. Geht natürlich auch mit einem normalen JOIN.

Code:
CREATE VIEW tab_alles
AS SELECT * 
     FROM tab_oft o
     JOIN tab_selten s
       ON s.tab_id = o.tab_id

Das Auftrennen verbessert die Lesegeschwindigkeit, wenn nur eine Tabelle (also nur ein Teil der Daten) gelesen werden muss.
Daten in so eine "Tabelle" einfügen, ändern oder löschen kann komplizierter werden, wenn erst geprüft werden muss, welche Tabelle (oder beide Tabellen) betroffen sind. Beim Löschen hilft natürlich ein FOREIGN KEY mit ON DELETE CASCADE.

Die Datenbank-Parameter (MySQL) auf dem Server (my.ini), sowie verfügbarer RAM, die IO-Geschwindigkeit der Platten etc. haben einen großen Einfluss auf die Geschwindigkeit.

Grüße
Thomas

Geändert von thomas_w (19.03.2010 um 15:04 Uhr). Grund: Schreibfehler
  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
[Erledigt] Kein Ergebnis bei SELECT (MySQL 4.1.9) dr.e. Datenbanken 4 15.06.2008 19:54
MySQL in PHP integrieren (Windows 2003 Server ohne Apache) Plague Server, Hosting und Workstations 3 30.08.2007 21:56
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
MySQL Abfrage von Ver. 5 für Ver 3. des MySQL Servers FireFIghter Datenbanken 3 02.02.2007 17:18
tutorial mysql klassen im oop projekt phpdummi Beitragsarchiv 4 17.01.2007 20:17
Ideen für Tageszeitung mit XML, MySQL, PHP gesucht webazubi PHP-Fortgeschrittene 7 06.07.2006 12:25
PHP 5.1.2 mySQL 5.0.19 MS-SQL 2005 IIS 6.0 Shakaar PHP-Fortgeschrittene 10 26.03.2006 22:23
[Erledigt] not allowed to connect to this MySQL server PHP Tipps 2005-2 2 23.09.2005 18:34
MySQL & PHP: Problem mit Password() Datenbanken 10 19.09.2005 11:00
mysql_result(): supplied argument is not a valid MySQL PHP Tipps 2005-2 4 25.08.2005 14:44
[Erledigt] MySQL Befehl für MySQL 4.0.24 Datenbanken 2 23.08.2005 17:35
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
MySQL Erweiterungen nicht gefunden Datenbanken 4 27.08.2004 23:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql 1:1 beziehung, mysql auslagern, mysql 1 zu 1 beziehung, 1 zu 1 beziehung sinnvoll, mysql 1:1 relation, php mysql verbindung auslagern, mysql datenbank auslagern, 1:1 beziehung, mysql 1 1 beziehung, mysql 1zu1 beziehung, 1 zu 1 beziehung mysql, datenbank 1:1 beziehung, 1:1 beziehung sinnvoll, foreign key sinnvoll, mysql tabelle auslagern, mysql daten auslagern, 1:1 beziehung mysql, mysql 1:1, mysql connect auslagern 2010, php mysql auslagern

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:44 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