php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.02.2008, 13:17  
Neuer Benutzer
 
Registriert seit: 28.09.2007
Beiträge: 6
nixahnung
Standard join über 2 db oder tabellen einer db - performance

hallo,

habe zb. 10 identische anwendungen zu ein anwendung verknüpft.

ideal wäre jeder anwendung eine eigene db zu geben,
nun frage ich mich ob es aus performance gründen eine
db mit 10 tabellensätzen sinvoller wäre.
(die db hätte dann zb 10 mal die tabelle user: user_1, user_2, usw.)
die ids (autoincrement) würden jeweils mit 10000 höher gesetzt das es keine überschneidungen gibt.


was ist sinnvoller, abfrage über 10 db's oder eine db mit 10 tabellen sätzen?
es liegt alles auf dem gleichen server
nixahnung ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 17.02.2008, 15:41  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Die Frage ist zu allgemein. autoincrement mit verschiedenen Werten geht m.E. nicht
nikosch ist offline   Mit Zitat antworten
Alt 17.02.2008, 19:32  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nixahnung,

du solltest IMHO das Software-Design komplett überdenken. Meiner Einschätzung nach sollte das Datenmodell so geartet sein, dass du nur noch Objekte irgendwelcher Art pro Tabelle speicherst und die Zugehörigkeit zu einer Applikation oder zwischen Objekten entsprechend über Beziehungstabellen darstellst.

So kannst du beispielsweise eine Tabelle anlegen, die alle Instanzen von Applikationen enthalten. Diese verknüpfen über eine FK-Tabelle alle Objekte, die dort zugehören. Im konkrenten Anwendungsfall (Login) muss deine Datenschicht dann nur noch wissen, welche Applikation gerade ausgeführt wird und die relevanten Benutzer mit einem JOIN über von der Applikationstabelle über die Beziehungstabelle zur Benutzertabelle abfragen.

Alle weiteren Objekte stehen dann auch mittelbar oder unmittelbar mit der Applikation in Beziehung und erhalten somit die korrekte Zuordnung. So kannst du n Applikationen auf der selben Datenbasis halten und hast keine Zuordnungsprobleme. X Mal gleich geartete Tabellen zu haben ist nicht nur suboptimal, sondern aus Datenhaltungssicher auch Humbug.

Solltest du nähere Informationen benötigen, können wir hier gerne mal ein Beispiel diskutieren. Ich warne dich allerdings schon jetzt: eine komplexe Applikation wir niemals einfach sein!
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 17.02.2008, 23:35  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard Re: join über 2 db oder tabellen einer db - performance

Du drückst dich ziemlich unklar aus.
Möchtest du eine Anwendung für 10 User, oder 10 Anwendungen für 10 User? Geht es grundsätzlich um die selbe Anwendung, ist sie "mandantenfähig", oder handelt es sich um komplett verschiedene Projekte?

Wenn du antwortest, sei so nett und beantworte alle Fragen (ist leider nicht selbstverständlich hier, daher erwähne ich es).
Zergling-new ist offline   Mit Zitat antworten
Alt 19.02.2008, 00:39  
Neuer Benutzer
 
Registriert seit: 28.09.2007
Beiträge: 6
nixahnung
Standard

hallo,
danke für die zum teil recht ausführlichen antworten.

habe mich wohl undeutlich ausgedrückt

zweiter versuch:

1.)
habe eine komplexe mandantenfähige anwendung.

2.)
diese anwendung habe ich jetzt zu einer multianwendung mit nur einer datenbank (1 Tabellensatz) umgestrickt. (im prinzip wie zb. ein forum im forum oder shop in shop system).

3.)
die unbeständigen bzw. veränderlichen inhalte sind in der datenbank, die beständigen sind in dateien gespeichert.

4.)
diese anwendung bedient zur zeit 15 domains wobei zu jeder domain dynamisch die passenden dateien und entsprechend gefilterte bzw. passende inhalte der datenbank (kategorien) eingebunden werden.

5.)
da diese möglichkeit sehr begrenzt ist, möchte ich nun jeder domain einen tabellensatz zur verfügung stellen um auch die beständigen inhalte in der datenbank hinterlegen zu können (eine für den user selbstverwaltete anwendung mit einigen einschränkungen)

-----------------------------------
6.)
(ab jetzt zu meiner frage bzw. zu meinem problem)

1 domain mit einem tabellensatz stellt den master dessen tabellen* mit den tabellen* der anderen anwendungen zu verknüpfen sind (* nur die relevanten tabellen mit adressen, kommentare, etc.)

7.)
um überschneidungen zu vermeiden wird bei den verknüpften tabellen die id (auto_increment) vorgegeben.
also domain 1 hat die id's 1 bis 1000, die domain 2 hat die id's 1001 bis 2000, usw.

8.)
setze ich nun die tabellensätze in jeweils eine eigene datenbank oder setze ich alle tabellensätze in eine datenbank (die einzelnen tabellen der tabellensätze mit jeweils _1, _2, etc. bezeichnet)
die tabellenbezeichnungen habe ich in der konfiguration hinterlegt und bei den abfragen durch platzhalter eingebunden. dadurch sind nun mehrere tabellensätze in einer db möglich.

9.) welche variante ist zu empfehlen (performance), alle tabellensätze in eine db oder je tabellensatz eine db ?


ODER.....

ist mein ansatz falsch? wie könnte ich sonst eine zentrale adminstration umsetzen?

@dr.e.
Zitat:
eine komplexe Applikation wir niemals einfach sein!
allerdings, sehe alles schon als komplexe applikation... :wink:

@Zergling
@nikosch77
Ich hoffe meine ausführung konnte mein vorhaben jetzt nicht nur für mich verständlich rüberbringen
nixahnung ist offline   Mit Zitat antworten
Alt 19.02.2008, 01:46  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
vom Bauchgefühl her würde ich sagen, 10 Datenbanken sind nicht performanter als 1 Datenbank, weil hier 10 Datenbanken in den Cache müssen, da du vermutlich dauernd darauf zugreifen musst. Andererseits ist es vielleicht egal ob 10 * 1/10 oder 10 * 1 und rein logisch macht diese "logische" Trennung in verschiedene Datenbanken ja durchaus Sinn. Aber raten kannst du ja auch.

dr.e. kann dir da vielleicht besser weiterhelfen.
Zergling-new ist offline   Mit Zitat antworten
Alt 19.02.2008, 13:50  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nixahnung,

Zitat:
ODER.....

ist mein ansatz falsch? wie könnte ich sonst eine zentrale adminstration umsetzen?
Ja. Aus meiner Perspektive ist das definitiv der falsche Ansatz. Um hier zukünftig glücklicher zu werden solltest du eine weitere Organisationsschicht einführen: eine Applikation. Diese hat je nach Bedarf bestimmte Konfigurationen und die zugehörigen Objekte. Über ein "für jedes Objekt eine Tabelle und Beziehungen in Beziehungstabellen auslagern"-Konzept sollte das auch einfach abbildbar sein. Hierbei hast du dann sogar den Vorteil, dass jede Beziehung multidimensional auflösbar ist und neue Objekte nicht das komplette Datenmodell tangieren.

Da ich nicht genau weiß, welche Objekte deine Applikation hat, kann ich nur ein bischen fabulieren. Grundsätzlich sollte dir aber das folgende UML zeigen, wie man soetwas aufzieht.



In der Instanz der Applikation musst du natürlich die ID der Applikation bekannt geben, sonst hat der für die Initiualisierung dieser zuständige Quellcode-Teil keine Chance seine Arbeit zu tun. Weiterhin wird es immer Teile geben, die du nicht in der Datenbank konfigurieren/ablegen kannst (z.B. Datenbank-Zugangsdaten). Hier solltest du aus Performance-Gründen genau betrachten, was in die DB geschrieben wird und was in Text-Dateien. Für letzteres bieten sich *.ini-Dateien an. PHP implementiert hier mit der Funktion parse_ini_file() eine sehr effiziente und schnelle Möglichkeit auf diese Dateien zuzugreifen.

Solltest du Fragen dazu haben, empfehle ich dir http://www.adventure-php-framework.o...plomarbeit.pdf zu lesen, oder mal auf der Webseite in meinem Footer vorbeizuschauen. Hier ist insbesondere das Gästebuch-Tutorial interessant.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 20.02.2008, 10:52  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nixahnung,

ich hoffe dir hat es nicht die Sprache verschlagen. Falls du etwas nicht verstehst, dann frag bitte. Wie schon gesagt, wirst du komplexe Probleme nicht mit einfachen Mitteln erschlagen können.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 22.02.2008, 21:00  
Neuer Benutzer
 
Registriert seit: 28.09.2007
Beiträge: 6
nixahnung
Standard einfacher?

hallo,
sorry das ich mich erst jetzt wieder melde.

Zitat:
m hier zukünftig glücklicher zu werden solltest du eine weitere Organisationsschicht einführen: eine Applikation. Diese hat je nach Bedarf bestimmte Konfigurationen und die zugehörigen Objekte. Über ein "für jedes Objekt eine Tabelle und Beziehungen in Beziehungstabellen auslagern"-Konzept sollte das auch einfach abbildbar sein. Hierbei hast du dann sogar den Vorteil, dass jede Beziehung multidimensional auflösbar ist und neue Objekte nicht das komplette Datenmodell tangieren.
ein einfaches beispiel möglich?

zb. die kategorie user.
da habe ich je anwendung eine tabelle für die user und eine für deren zusätzliche angeben wie hobby, etc. die ja in beziehung zueinander stehen.
die inhalte dieser tabellen möchte ich jetzt von jeder anwendung auch in der master anwendung haben.
ich dachte da eine abfrage die alle usertabellen der einzelen anwendungen abfragt.
nixahnung ist offline   Mit Zitat antworten
Alt 23.02.2008, 13:03  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.654
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nixahnung,

Zitat:
ein einfaches beispiel möglich?
Gibt es bei komplexen Applikationen nicht...

Zitat:
zb. die kategorie user.
da habe ich je anwendung eine tabelle für die user und eine für deren zusätzliche angeben wie hobby, etc. die ja in beziehung zueinander stehen.
die inhalte dieser tabellen möchte ich jetzt von jeder anwendung auch in der master anwendung haben.
ich dachte da eine abfrage die alle usertabellen der einzelen anwendungen abfragt.
Ich glaube du hast mein ER-Diagram nicht verstanden, denn da ist exakt das Beispiel Benutzer (in diesem Fall "Person" genannt) schon enthalten. Du gehst dabei wie folgt vor:
- Die ID deiner Applikation wird irgendwo global definiert und ist der Datenschicht bekannt
- Du legst eine Tabelle "Application" an
- Du legst eine Tabelle "User" an
- Du legst eine Tabelle "cmp_Application2User" an

Anschließend kannst du mit dem folgenden Statement alle Benutzer einer Applikation abfragen:

Code:
SELECT * FROM User
INNER JOIN cmp_Application2User ON User.UserID = cmp_Application2User.UserID
INNER JOIN Application ON cmp_Application2User.AppsID = Application.AppsID
WHERE Application.AppsID = '123';
Möchtest du beispielsweise prüfen, ob ein Benutzer existier, funktioniert das wie folgt:

Code:
SELECT COUNT(User.UserID) AS UserExists FROM User
INNER JOIN cmp_Application2User ON User.UserID = cmp_Application2User.UserID
INNER JOIN Application ON cmp_Application2User.AppsID = Application.AppsID
WHERE 
Application.AppsID = '123'
AND
User.Username = 'abc'
AND
User.Passwort = 'hash';
Bei allen anderen Objekten (=Tabellen) verhält es sich gleich. Du musst nur einfach immer über die Applikation auf eine Tabelle JOINen, sofern du nicht ohnehin eine ID eines Objekts hast du darüber auf die Kind- oder Eltern-Objekte zugreifen kannst. Um das sauber implementieren zu können, solltest du das Daten Lesen und Schreiben über eine eigene Datenschicht erledigen, damit deine Applikation da nichts davon mitbekommt. Mit geeigneten Indizes ist das JOIN (da INNER JOIN) auch schnell genug.

Solltest du noch Fragen haben, melde dich einfach. Vielleicht können wir dann auch mal gemeinsam eine Beispiel-Applikation entwerfen, damit dir klar wird, wie das funktioniert. Dafür bräuchte ich aber eine komplette Spezifikation der in deiner Anwendung vorkommenden Objekte und deren Beziehungen.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. 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
performance problem mit join leo Datenbanken 4 14.01.2008 22:31
MySQL Join mit 3 Tabellen quichibo Datenbanken 2 18.10.2007 10:58
Temporäre Tabellen und Performance Olsen Datenbanken 2 09.09.2006 17:08
JOIN problem 2 tabellen - zeile(tab1) zu spalte(tab2) Ministry Datenbanken 7 31.05.2006 10:31
Problem mit Inner join Jabi Datenbanken 15 09.05.2006 14:10
LEFT OUTER JOIN für mehr als 2 Tabellen ? Alpha Centauri Datenbanken 4 05.04.2006 16:18
2 Tabellen: Left outer join??? Datenbanken 2 14.09.2005 13:11
3 Tabellen mit JOIN verknüpfen? becks123 Datenbanken 6 13.08.2005 00:05
[Erledigt] Join mit 3 Tabellen Datenbanken 21 16.05.2005 23:20
INNER JOIN mit 4 tabellen ??? Dragon26mFR Datenbanken 5 01.05.2005 18:51
Join aus drei Tabellen Datenbanken 9 04.03.2005 10:02
Ich bekomme nen einfachen JOIN von 2 Tabellen nicht hin. pino Datenbanken 1 06.01.2005 21:09
Join aus 3 Tabellen mit nur einer Verknüpfung? Datenbanken 7 24.09.2004 18:25
Abfrage über 2 Tabellen / Join agrajag Datenbanken 2 14.09.2004 23:05
[Erledigt] Join für Select Count(`id`)-Abfrage über 4 Tabellen Datenbanken 4 10.07.2004 18:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
db join, mehrere tabellen joinen performance, join über mehrere datenbanken, join verschiedene datenbanken, tabelle joinen, tabelle verwendungsgebiete, php parse_ini_file performance, tabellen join performance, http://www.php.de/datenbanken/45519-join-ueber-2-db-oder-tabellen-einer-db-performance.html, select über mehrere dbs, db join performance, performance datenbank ids einführen und joinen, join db, php parse_ini_file tabelle, db joins performance, inner join verschiedenen datenbank, uber2db, tabellen join geschwindigkeit, join von tabellen verschiedener datenbanken, php join db

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