php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 18-08-2012, 16:35
Gamer20
 Registrierter Benutzer
Links : Onlinestatus : Gamer20 ist offline
Registriert seit: Mar 2005
Beiträge: 336
Gamer20 kann nur auf Besserung hoffen
Standard Verfahren -> Gruppensystem ala Communityseiten?

hi!

Ich möchte mal das Prinzip der Gruppensysteme aufgreifen.

Leider weiß ich net genau wie ich die DB Struktur aufbauen sollte.

es geht darum:

Ich bin Mitglied in mehreren Gruppen, in diesen Gruppen werden Nachrichten geschrieben.

Auf einer Seite sollen mir die Nachrichten dieser Gruppen angezeigt werden, in denen ich Mitglied bin.

1. Schritt:

eine Tabelle mit den Nachrichten

ID
Author (der Nachricht)
GruppenID (die ganzen ID's der Gruppen die die Leseberechtigung haben)

die Spalte GruppenID würde ich als Textfeld machen.

warum? damit ich alle Gruppen die die Berechtigung haben, in 1 Zelle habe und damit ein einfacher abgleich möglich wäre (denke ich).

2. Schritt:

eine Tabelle mit meinen Gruppen in denen ich Mitglied bin

ID
MitgliedID
NamederGruppe

jetzt müßte ich anhand meiner MitgliedID in der Spalte MitgliedID (...WHERE MitgliedID = '$ID' ) einen Abgleich machen, ob von den ganzen Datensätzen (Zelle ID) 1 Wert IN DER 1. Tabelle mit den Nachrichten -> in der Spalte GruppenID eine ID vorhanden ist.

Beispieldatensatz:

z.B. 1. Tabelle

*ID
*Author
*GruppenID

905937 (*ID -> Index bzw. Schlüssel der Tabelle)
675(*AuthorID)
266,7443,23,446,8988,232,63,29567(*GruppenID's)

2. Tabelle -> und meine Mitgliedschaft in folgenden Gruppen

*ID
*MitgliedID
*NamederGruppe

1. Gruppe:

63 (*ID -> Index bzw. Schlüssel bzw. GruppenID meiner erstellen Gruppe)
675(*MitgliedID -> meine ID Nummer auf der Homepage)
Abteilung Buchhaltung (*NamederGruppe)

2. Gruppe:

446 (*ID -> Index bzw. Schlüssel bzw. GruppenID meiner erstellen Gruppe)
675(*MitgliedID -> meine ID Nummer auf der Homepage)
Abteilung Poststelle (*NamederGruppe)

Ich Hoffe ich konnte das einigermaßen erklären.

2. Gedanke war, statt eines Textfeldes mit allen ID's, einen Datensatz pro ID machen.

Dann würde das aber bedeuten, das ich bei 1 Nachricht und 5 Gruppen die die Nachricht erhalten sollen, 5 Datensätze habe, damit würde ich mir doch meine Tabelle bzw. Datenbank zu müllen oder?

ODER

Sollte ich 3 Tabellen machen?

1. Tabelle die Nachricht

2. Tabelle die ID der Nachricht (ID -> 2356) + die ID der Gruppen

2356 | 23
2356 | 446
2356 | 83448

Oder liege ich mit den 3 Varianten auch total falsch?

Hat jemand dann eine Idee wie so etwas funktioniert?

Bestes Beispiel bei diesen sozialen Netzwerken ist doch diese genannte Pinnwand.

da sehe ich die Nachrichten von den Gruppen in denen ich Mitglied bin (wenn der Author der Nachticht meine GruppenID als Berechtigung mit gegeben hat).

Geändert von Gamer20 (18-08-2012 um 16:43 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 18-08-2012, 18:28
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

mehrere IDs in eine Spalte zu schreiben, ist eine ganz schlechte Idee. Die Variante mit der dritten Tabelle, welche die Zuordnungen enthält (n:m-Relation) ist der Weg, den man für so etwas üblicherweise geht.

Für eine normalisierte Datenbank solltest du sowieso darauf achten, dass in den einzelnen Spalten atomare Werte gehalten werden. Irgendwelche Komma- oder sonstwie getrennten Werte sind ein sicheres Zeichen für schlechtes Design.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #3 (permalink)  
Alt 18-08-2012, 18:47
Gamer20
 Registrierter Benutzer
Links : Onlinestatus : Gamer20 ist offline
Registriert seit: Mar 2005
Beiträge: 336
Gamer20 kann nur auf Besserung hoffen
Standard

hmm die 3. variante mit den 3 tabellen wäre auch mit inner Join am einfachsten zu realisieren (denke ich).

aber hat man da nicht doppelte datensätze in der DB (beim auslesen kann man ja gruppieren).

bzw. hat man dann nicht extra viele datensätze? jeder seitenbetrieber versucht doch auch die DB klein zu halten und nicht nur die PHP scripte.

hmm und die 1. variante mit den ID's im textfeld mit simmikolon getrennt und zusätzlich eine art LIKE mit "%" abfrage wäre wohl zu viel und zu unschön von der struktur her? aber da hätte ich weniger datensätze die durchsuch werden müssen.

OK wenn ich ein textfeld nehme, statt INT, verbrauche ich ja auch einiges. da ein textfeld mehr bytes reserviert, als ein INT feld.

oh man ich habe kopfschmerzen.

aber die 3. variante scheint wohl am logischsten.

schade das man net bei google+ und co. einfach mal nachfragen kann, die werden es einem eh net verraten.

Geändert von Gamer20 (18-08-2012 um 18:49 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 18-08-2012, 19:19
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Gamer20 Beitrag anzeigen
hmm die 3. variante mit den 3 tabellen wäre auch mit inner Join am einfachsten zu realisieren (denke ich).
Richtig.

Zitat:
Zitat von Gamer20 Beitrag anzeigen
aber hat man da nicht doppelte datensätze in der DB (beim auslesen kann man ja gruppieren).
Nein, wieso sollte man doppelte Datensätze in der DB haben? Man hat höchstens wiederholende Teiltupel in der Ergebnismenge beim Joinen, aber das muss man dann sowieso (wie du schon sagtest) mit einem Gruppenwechsel verarbeiten.

Zitat:
Zitat von Gamer20 Beitrag anzeigen
bzw. hat man dann nicht extra viele datensätze?
Ja, aber dafür sind DBMS ja da, um vernünftig mit Massendaten arbeiten zu können. Bei ein paar Millionen Datensätzen ist ein normales DBMS eher noch unterfordert.

Zitat:
Zitat von Gamer20 Beitrag anzeigen
jeder seitenbetrieber versucht doch auch die DB klein zu halten und nicht nur die PHP scripte.
Ich kenne nicht einen, der das jemals behauptet hätte. Ich kenne aber viele, die versuchen, die DB sauber zu halten und dazu gehört ein vernünftig normalisiertes und indiziertes Datenmodell.

Zitat:
Zitat von Gamer20 Beitrag anzeigen
hmm und die 1. variante mit den ID's im textfeld mit simmikolon getrennt und zusätzlich eine art LIKE mit "%" abfrage wäre wohl zu viel und zu unschön von der struktur her? aber da hätte ich weniger datensätze die durchsuch werden müssen.
Wenn du wüsstest, wie aufwändig es für MySQL ist, irgendeine LIKE-Bedingung zu prüfen, statt mal schnell durch den Binary Tree mit den Fremdschlüsseln zu rauschen, würdest du diese Variante schon deswegen nicht mal in Erwägung ziehen. Mal von den typischen Fehlern abgesehen, die einem mit LIKE schnell passieren können.

Zitat:
Zitat von Gamer20 Beitrag anzeigen
aber die 3. variante scheint wohl am logischsten.
Sagte ich ja.

Zitat:
Zitat von Gamer20 Beitrag anzeigen
schade das man net bei google+ und co. einfach mal nachfragen kann, die werden es einem eh net verraten.
Sofern die noch mit relationalen Datenbanken arbeiten, würden die genau wie alle anderen auch ein normalisiertes Datenmodell benutzen, weil alles andere einfach keinen Sinn macht.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #5 (permalink)  
Alt 18-08-2012, 19:32
Gamer20
 Registrierter Benutzer
Links : Onlinestatus : Gamer20 ist offline
Registriert seit: Mar 2005
Beiträge: 336
Gamer20 kann nur auf Besserung hoffen
Standard

super danke für die erklärungen.

werde nächstes wochenende mal versuchen das auszulesen.

wenns noch bissle holpern sollte (obwohl die anderen abfragen mit INNER JOIN ja klappen), kann ich mich ja immer noch mal melden.

aber erstmal VIEELLLEENNNN DANK.
Mit Zitat antworten
  #6 (permalink)  
Alt 26-08-2012, 21:56
Gamer20
 Registrierter Benutzer
Links : Onlinestatus : Gamer20 ist offline
Registriert seit: Mar 2005
Beiträge: 336
Gamer20 kann nur auf Besserung hoffen
Standard

hmm ich wollte eine unterabfrage machen:

Code:
$ausgabe = mysql_query("SELECT * FROM Gruppennamen WHERE ID  = (SELECT GRPID FROM Gruppenpersonen WHERE NID2 = '$ID')");
while($i = mysql_fetch_array($ausgabe))
{
...
}
d.h. ich benötige erst die GRPID aus der 2. tabelle (die gruppe in der ich vorhanden bin), um dann mir aus der 1. tabelle die daten (wie name, erstellungsdatum und die ID des gruppenleiters) heraus zu holen.

ich könnte zwar in aus der schleife zuerst mir die GRPID raus holen und ann in dieser schleife (...) wieder eine neue abfrage zu machen für die 1. tabelle.

wäre aber zu aufwendig, darum wollte ich das in "einem abwasch" machen.

leider spuckt SQL mir nur das aus:

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Program Files\xampp\htdocs\*.php on line 26

jemand eine idee was an meiner unterabfrage falsch ist?

[EDIT]

Fehler gefunden (man ich sollte nach einigen stunden programmierung doch erstmal ins bett gehen)

hier die lösung, für die die genau das selbe machen wollen wie ich:

Code:
$ausgabe = mysql_query("SELECT * FROM Gruppennamen WHERE ID  IN (SELECT GRPID FROM Gruppenpersonen WHERE NID2 = '$ID')");
while($i = mysql_fetch_array($ausgabe))
{
...
}
wer eine effizientere methode hat (was sql weniger belastet), darf es mir gerne mitteilen.

Geändert von Gamer20 (26-08-2012 um 22:19 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Suche Programmierskripte für Part-Period-Heuristik bzw. Wagner-Whitin-Verfahren Jrue11 Apps und PHP Script Gesuche 2 09-01-2012 15:05
Part-Period-Heuristik bzw. Wagner-Whitin-Verfahren Jrue11 PHP Developer Forum 0 09-01-2012 12:55
login-Verfahren ways PHP Developer Forum 5 14-07-2009 18:36
Public Key Verfahren mit PHP bitesser BRAINSTORMING PHP/SQL/HTML/JS/CSS 8 07-09-2005 16:35
Startseite alá mstart.de yzBastian Apps und PHP Script Gesuche 4 26-12-2004 18:33

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:36 Uhr.