Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mini serwis społecznościowy- jakie wybrać rozwiązania w architekturze baz mysql
Forum PHP.pl > Forum > Przedszkole
aras16
Witam.
Postanowiłem napisać miniserwis społecznościowy.
Jego opcje to:
-dodawanie zdjęć
-wysyłanie wiadomości między użytkownikami
-komentowanie zdjęć
Mam co do tego następujące pytania:
-czy do wiadomości w MySql tworzyć jedną tabele gdzie będzie się zapisywało nadawce, odbiorce (nadawca i odbiorca typu int powiazane relatywnie z bazą uzytkownicy) i treść, nastepnie filtrować te wiadomości dla konkretnego usera(po id)
- czy też tworzyć dla każdego usera osobną tabelkę
Co będzie bardziej wydajne?


Nastepne pytanie związane z dodawaniem zdjęć
-czy dla każdego usera tworzyć katalog ze zdjęciami czy też zrobić ktalog zdjęcia dla wszystkich
I tu tez pytanie co bardziej wydajne smile.gif
Z góry dzięki za pomoc.
Pozdrawiam winksmiley.jpg
Wieviór
Na pewno nie nową tabelkę dla każdego usera, Twój pomysł z wiadomościami bardzo dobry myślę ;]

Ze zdjęciami chyba najlepiej wrzucać je do jednego (ew. więcej) katalogu. Zmieniać nazwy, i też zrobić tabelkę z id_zdjęcia, id_usera, link, tytuł, opis.

No i komentarze do zdjęć tak samo, id_komentarza, id_zdjęcia, id_dodającego, treść ;]
aras16
Mam pytanie.
Czy jest jakaś różnica w wydajności:
- jak 1000 userów jednocześnie odwołuje się do jednej tabelki
-jak 1000 userów odwołuje się do kilku tabel
Oczywiście zastosuje jak mi poleciłeś ale z ciekawosci pytam smile.gif
Grzyw
Cytat(aras16 @ 16.02.2008, 10:39:31 ) *
Czy jest jakaś różnica w wydkoajności:
- jak 1000 userów jednocześnie odwołuje się do jednej tabelki
-jak 1000 userów odwołuje się do kilku tabel


No pewnie, że jest! smile.gif Gdybyś skorzystał na przykład ze złączenia dwóch tabel, wyszukując z tych tabel powiązane dane, czas wykonywania operacji będzie znacznie dłuższy.
Z drugiej strony - unikaj sytuacji, ze w tabeli users na przykład, będzie 20 kolumn. Zapytanie
  1. SELECT * FROM users

byłoby wówczas nisko wydajne. W takiej sytuacji lepiej jest rozbić dane na 2 tabele grupujące cechy usera w jakiś logiczny sposob, np. tabelki users i profile.
Zwróć uwagę, ze jak masz w zmiennej ID usera, to możesz wykonać zamiast selectu z dwóch tabel dwa osobne selecty na dwóch tabelach, odwołując się do konkretnego ID. Dzięki temu możesz wybierać tylko to, co naprawdę potrzebujesz.
Wieviór
Zdecydowanie.

Ja np. mam np. tabele:
  • user_basic
  • user_dane
  • user_opcje
  • user_uprawnienia
Zawsze warto dzielić. Na przykład, przy wiadomościach możesz zrobić tabelę: id_wiad(klucz), id_odbiorcy, id_nadawcy, tytuł; i drugą: id_wiad, treść. Bo tak np. przy pokazywaniu skrzynki odbiorczej, pobierzesz tylko dane z pierwszej tabeli, a z drugiej skorzystasz tylko przy wyświetlaniu ;]
-aras16-
Ale robienie tabeli dla kazdego usera nie jest wydajne?
Wieviór
Cytat(-aras16- @ 16.02.2008, 14:58:45 ) *
Ale robienie tabeli dla kazdego usera nie jest wydajne?


Zdecydowanie nie.
aras16
Jecze jedno pytanie smile.gif
Jak pobrać z bazy x rekord który spełnia warunek np.
  1. SELECT nadawca, temat, tresc FROM message WHERE id=1

Czy istnieje możliwość pobrania np 5 rekordu który spełnia warunek , nie robiąc pętli pobierania danych 5 razy i dopiero wyświetlanie wyniku?
Wieviór
Robisz w tabeli tz. klucz (index) i po nim właśnie wybierasz odpowiedni rekord.
aras16
No tak normalnie bym wybierał po id, Jest jednak jedno ale:
id_wiad(klucz) id_odbiorcy id_nadawcy, tytuł;
To jest struktura tabeli, zapytanie select pobiera rekordy gdzie id_nadawcy=id_usera. W takim zapytaniu id może być różne np. 2,5,8,9 ;/
Wieviór
Najpierw robisz skrzynkę odbiorczą:

  1. SELECT * FROM wiadomosci WHERE id_odbiorcy=id


Dajesz tutaj while z czymś takim:

  1. <?php
  2. while ()
  3. {
  4. $lp++;
  5. echo $lp.'. <a href="pokazwiadomosc.php?id='.$rekord[id].'">'.$rekord['tytul'].'</a><br>';
  6. }
  7. ?>


W pliku pokazwiadomosc.php pokazujesz wiadomość z pomocą zapytania:

  1. <?php
  2. $sql = "SELECT * FROM wiadomosci WHERE id_wiad='".$_GET[id]."'";
  3. ?>
nrm
Cytat(-aras16- @ 16.02.2008, 12:58:45 ) *
Ale robienie tabeli dla kazdego usera nie jest wydajne?

pal licho wydajność, przede wszystkim jest BEZ SENSU ;) Czy kolega korzystał już z zapytań łączących 2,3 czy więcej tabel? Polecam jakiś wstęp do SQL z obojętnie jakiej książki.
-aras16-
Z zapytań łączonych korzystałem, książkę o SQL też czytałem. A co do mojego pytania myślałem że jak dużo ludzi sie do jednej tabeli łączy to jest gorzej jakby to rozłożyć na pare tabel biggrin.gif ale się myliłem

PS. W końcu to jest przedszkole biggrin.gif
-aras16-
Mam jeszcze jedno pytanie:
Czego użyć aby można było wyświetlać stronę z użytkownikiem pod adresem
www.jakasstrona.pl/?nazwa_użytkownika
Wieviór
http://wortal.php.pl/wortal/artykuly/pomys.../przyjazne_urle

Daleko szukać nie trzeba ;]
aras16
Użyłem $_SERVER['PATH_INFO'] plik się includuje tylko czemu jak używam tej zmiennej na stronie nie mam stylów css-a
Wieviór
Pokaż kod strony i ten adres który wpisujesz.
aras16
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <head>
  3. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
  4. <link rel="Stylesheet" type="text/css" href="style.css" />
  5. <title>Wirtualna wioska</title>
  6. </head>
  7. <body>
  8. <?php
  9.  
  10. $link = mysql_connect("127.0.0.1","root", "haslo") or die ("Nie można nawi‘zać poł‘czenia.");
  11. mysql_select_db("baza");
  12. include("funkcje.php");
  13.  
  14. ?>
  15. <div class="strona">
  16. <div class="top">
  17. <div class="logo"></div><div class="haslo"><center><h1>Portal</h1></center></div>
  18. <div class="link"><? include("./linki.php");?> </div>
  19.  
  20. </div>
  21.  
  22. <div class="panel"><?php include("./panellewa.php"); ?></div>
  23. <div class="tresc"><? include("./sys.php"); ?></div>
  24. <div class="stopka"><? include("./stopka.php"); ?></div>
  25.  
  26.  
  27. </div>
  28.  
  29.  
  30. </body>
  31. </html>


sys.php:
  1. <?php
  2. include('.'.$_SERVER['PATH_INFO'].'.php');
  3. ?>

adres:
127.0.0.1/index.php/logowanie
Strone includuje ale brak css-a

Jeżeli natomiast plik sys.php wygląda tak:
  1. <?php
  2.  include('.'.$_SERVER['PATH_INFO']);
  3. ?>

A adres strony wygląda tak:
127.0.0.1/index.php/logowanie.php
To styl css jest ale nie wyświetla się grafika która w stylach jestzapisana biggrin.gif
-aras16-
Mam jeszcze jedno pytanie smile.gif
-lepiej tworzyć drugi plik z miniaturką zdjęcia, czy zmieniać width i height znacznika img przy wyświetlaniu duzego zdjęcia?
Grzyw
Cytat(-aras16- @ 17.02.2008, 16:18:05 ) *
Mam jeszcze jedno pytanie smile.gif
-lepiej tworzyć drugi plik z miniaturką zdjęcia, czy zmieniać width i height znacznika img przy wyświetlaniu duzego zdjęcia?

Przeglądarka pobiera najpierw obraz w oryginale i skaluje go dopiero lokalnie. Myślę, że to wszystko wyjaśnia smile.gif
Wieviór
Aras, dodaj do <head></head>:

Kod
<base href="http://www.example.com/"/>
sniezny_wilk
Ja chciałbym się odnieść do początku dyskusji, do pytania aras'a o ilość katalogów. Z tego co mi wiadomo, lepiej utworzyć większą ilość katalogów niż wszystko pchać do jednego. Załóżmy 1000 zdjęć w jednym katalogu, czy listowaliście kiedyś zawartość katalogu w którym jest tyle plików ? Strasznie długo to trwa i niepotrzebnie "zżera" zasoby serwera, optymalnym rozwiązaniem będzie trzymanie zdjęć w wielu katalogach (po jednym na użytkownika).
aras16
Cytat(Grzyw @ 17.02.2008, 16:44:20 ) *
Przeglądarka pobiera najpierw obraz w oryginale i skaluje go dopiero lokalnie. Myślę, że to wszystko wyjaśnia smile.gif

Czyli mam wybierac między ilością danych jakie będą zajmowały foty (miniatury trochę miejsca też zajmą przy większej liczbie osób), a transferem biggrin.gif

Cytat(Wieviór @ 17.02.2008, 17:13:51 ) *
Aras, dodaj do <head></head>:

Kod
<base href="http://www.example.com/"/>

Działa dzięki smile.gif . A co jest lepsze $_GET czy PATCH_INFO (oprócz dobrego wyglądu url-i)


Mam jeszcze pytanie biggrin.gif:
czy można całkowicie pozbyć się index.php z adresu bo chcę zrobic aby wyśietlała się karta użytkownika pod adresem strona.pl/jakistamuser
Grzyw
Cytat(aras16 @ 17.02.2008, 19:06:04 ) *
Czyli mam wybierac między ilością danych jakie będą zajmowały foty (miniatury trochę miejsca też zajmą przy większej liczbie osób), a transferem biggrin.gif

Wybór jest prosty. Zobacz - zakładasz większą liczbę osób? To wyobraź sobie obciążenie serwera przy pobieraniu tych dużych zdjęć dla tej większej liczby osób smile.gif Nie, Aras, nie zastanawiaj się. Miniaturki obowiązkowo.

Cytat(aras16 @ 17.02.2008, 19:06:04 ) *
czy można całkowicie pozbyć się index.php z adresu bo chcę zrobic aby wyśietlała się karta użytkownika pod adresem strona.pl/jakistamuser


mod_rewrite Ci przetworzy URL na index.php
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.