Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] konstrukcja bazy - kilka trudnych pytań :)
Crenos
post 17.01.2009, 10:07:21
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 17.01.2009

Ostrzeżenie: (10%)
X----


Witam

Jest to mój pierwszy post na tym forum także witam wszystkich smile.gif
Mam kilka pytań odnośnie danych przechowywanych w jednym polu w bazie danych i sposobu ich pobierania.
Liczę na pomoc lub naprowadzenie mojego toku myślenia na poprawny smile.gif

1. Pierwsze pytanie
Chciałbym stworzyć drzewo wartości tak jak na poniższym schemacie:
-> poziom 1
-> poziom 1.1
-> poziom 1.1.1
-> poziom 2
-> poziom 2.1

Przy założeniu że będą 3 poziomy zagłębień to niema problemu mogę zrobić w bazie 3 kolumny które będą przenosiły poziom szczegółowości. Ale jak wykonać taką funkcjonalność gdy takich poziomów chciałbym mieć X? questionmark.gif

2. Drugie pytanie
Może okazać się, że rozwiązanie dla pytania pierwszego i 2 będzie takie samo, natomiast chciałbym jeszcze stworzyć relację danych w bazie jeden do wielu. O co mi chodzi:
np.:
Kowalski lubi sport i podczas wypełniania formularza zaznacza kilka dyscyplin sportowych. Chciałbym aby informacje które wybrał Kowalski trafiły do jednego pola w bazie danych. Nie chcę tworzyć 5 kolumn które będą opisywały zainteresowania Kowalskiego.
Chciałbym aby te dane przetrzymywane były w jednym polu np.:
mam listę zainteresowań, każde zainteresowanie ma swoje ID i żeby w takim polu była informacje 1;3;5;10 gdzie każda liczba oznacza ID zainteresowania.
I teraz tak:
a. Funkcjonalnie jest to jak najbardziej do wykonania, ale czy nie jest to przerost formy nad treścią. Stworzenie takiego mechanizmu jest troszkę skomplikowane.
b. Jak wyglądała by wydajność systemu gdy pobieralibyśmy informacje np.: 50 userów i jeszcze dodatkowo wykonywali X zapytań żeby pobrać ich zainteresowania.
c. Czy istnieje inna możliwość realizacji tego zagadnienia??

Od razu powiem kilka sów o sobie. Ekspertem w programowaniu nie jestem, ale mam troszkę pojęcia na ten temat. Potrafię posługiwać się google.pl smile.gif ale chodzi mi bardziej o to żeby ktoś naprostował mój tok myślenia jeżeli do czegoś źle podchodzę. Za konstruktywną krytykę się nie obrażam smile.gif

Pozdrawiam

Ten post edytował Crenos 17.01.2009, 10:32:06
Go to the top of the page
+Quote Post
scanner
post 17.01.2009, 11:03:13
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Jeżeli chodzi o punkt pierwszy, to polecam zapoznanie się z "Drzewkami Depesza": http://www.depesz.com/index.php/drzewka-w-bazach-danych/
Swego czasu wykonałem implementację (nieoptymalną) dla MySQL'a: http://www.scanner.eu.org/dev/zathras/


Jeżeli natomiast chodzi o punkt drugi, to trzymanie zainteresowań w jednym polu jest pomysłem chybionym. Powinieneś lepiej zastanowić się nad trzema tabelami: Użytkownicy, Zainteresowania i UzytkownicyZainteresowania. Ta trzecia będzie miała dwa pola: Id_Uzytkownik i Id_Zainteresowanie - dzięki temu w prosty sposób odczytasz wszystkie zainteresowania użytkownika oraz wszystkich użytkowników mających dane zainteresowanie.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Crenos
post 17.01.2009, 11:57:27
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 17.01.2009

Ostrzeżenie: (10%)
X----


Co do pierwszego to przeglądałem na szybko tę stronę i powiem Ci że to co jest przedstawione w 5 Metodzie jest bardzo interesujące.

A co do 2 pytanie smile.gif dzięki za sprowadzenie mnie na prawidłowy tok rozumowania smile.gif faktycznie tego nie przemyślałem pod tym kątem.
Ale z tego względu, że ja jestem dociekliwą bestią i liczę na Twoją wyrozumiałość smile.gif to jak przeanalizowałem to co napisałeś to jest dla mnie wszystko jasne. Ale czy widziałeś może inny sposób rozwiązanie tego zagadnienia questionmark.gif Bo w tym przypadku mamy tylko jedna niewiadomą której wartość jest X a druga zainteresowania jest z góry określona. A co w przypadku kiedy mamy 2 niewiadome questionmark.gif Czy taki układ będzie miał nadal taki wydajny jak w przypadku tylko jednej niewiadomej questionmark.gif
Go to the top of the page
+Quote Post
scanner
post 17.01.2009, 12:06:07
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Dwie niewiadome? Czyli chcesz wyświetlić co..? Wszystkie zainteresowania wszystkich userów?
Na pewno zaproponowane rozwiązanie będzie wydajniejsze niż trzymanie ID zainteresowań w polu tekstowym.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
Crenos
post 17.01.2009, 12:27:59
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 17.01.2009

Ostrzeżenie: (10%)
X----


Przy tym 2 pytaniu to moja pierwsza propozycja odpada bo wielkość jednego pola w bazie będzie olbrzymia.
Ale chodzi mi oto że np:
mam 1000 kowalskich albo X kowalskich
i mam 1000 zainteresowań labo Y zainteresowań
(porównanie nierealne ale chodzi mi o idee)
I jak każdy kowalski wybierze 1000 zainteresowań to otrzymamy 100 000 rekorów, funkcjonalnie nadal będzie to działało. Ale staram się patrzeć pod względem wydajności czy jest możliwość optymalizacji takiej struktury danych. Czy po prostu należy ograniczyć ilość wyświetlanych rekorów za jednym razem.
Go to the top of the page
+Quote Post
scanner
post 17.01.2009, 12:52:20
Post #6





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Po to są bazy danych, żeby obrabiać i przechowywać duże ilości rekordów.
Przykładowo jeden z moich klientów ma bazę, gdzie tabela relacji w drzewku depesza ma skromne 134099 rekordów i niczemu to nie przeszkadza, a ta ilość to i tak nie jest dużo.
Jeśli dobrze wszystko zaplanujesz, zarówno pod względem przechowywania jak i pobierania, to nie będzie dla Ciebie żadnego problemu.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
dr_bonzo
post 17.01.2009, 12:53:25
Post #7





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


A jak przy swojej metodzie pobierzesz userow zainteresowanych zainterewowaniem A?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
scanner
post 17.01.2009, 13:00:59
Post #8





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Creneos czy ja? tongue.gif
I jak rozumiem masz na myśli metodę z polem tekstowym? Już to wykluczyliśmy z rozumowania, więc spokojnie smile.gif


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
dr_bonzo
post 17.01.2009, 13:52:28
Post #9





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


@scanner:
Pewnie ze Creneos tongue.gif
Jak pisalem posta to twojego jeszcze nie bylo smile.gif

Cytat
I jak rozumiem masz na myśli metodę z polem tekstowym? Już to wykluczyliśmy z rozumowania, więc spokojnie

hymm, czytalem i jakos to umknelo mojej uwadze tongue.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Crenos
post 17.01.2009, 16:17:40
Post #10





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 17.01.2009

Ostrzeżenie: (10%)
X----


to znaczy tak smile.gif to jest generalnie proste smile.gif
"proste" do realizacji smile.gif - chyba bo nie próbowałem tego pisać smile.gif aktualnie przygotowuje środowisko - fedora 10 nadchodzi
zakładamy ze wszystkie dane które będą trafiać do pola z zainteresowaniami będą oddzielone separatorem np.: ";" średnik
pobieram dane z pola, segreguje i tworze z nich tablice, następnie sprawdzam czy szukane zainteresowanie jest przypisane do konkretnego kowalskiego jeżeli tak to wyświetlam szukane informacje

mam nadzieje że logicznie to napisałem, natomiast wydaje mi się, że tworzenie takiego czegoś to przerost formy nad treścią, ale dla sprawdzenie własnych umiejętności postaram się popełnić i przetestować kawałek takiego kodu
Go to the top of the page
+Quote Post
scanner
post 17.01.2009, 20:07:36
Post #11





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Z racji doświadczenia odradzam.
Tak się tego po prostu nie robi, a czas jaki zmarnujesz nie jest tego wart.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
dr_bonzo
post 17.01.2009, 21:03:29
Post #12





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Cytat
natomiast chciałbym jeszcze stworzyć relację danych w bazie jeden do wielu. O co mi chodzi:
np.:
Kowalski lubi sport i podczas wypełniania formularza zaznacza kilka dyscyplin sportowych.


Pierwszy blad - to jest relacja wiele do wielu, co standardowo w SQL robi sie przez dodanie 3ciej tabeli (UserZainteresowania) - jak juz @scanner pisal).

Cytat
Chciałbym aby informacje które wybrał Kowalski trafiły do jednego pola w bazie danych.

(***)To to sie moglo by nadawac w przypadku gdy Kowalski zaznacza swoje zainteresowania, i jedyna operacja wykonywana pozniej jest pokazanie zainteresowan usera.
Wszystkie inne wyszukiwania sa niewykonalne w praktyce.

Cytat
Nie chcę tworzyć 5 kolumn które będą opisywały zainteresowania Kowalskiego.

Przy N:M bedziesz mial w takim przypadku 5 rekordow dla Kowalskiego + mozliwosc modyfikowania zainteresowan bez zmiany schematu bazki.

Cytat
b. Jak wyglądała by wydajność systemu gdy pobieralibyśmy informacje np.: 50 userów i jeszcze dodatkowo wykonywali X zapytań żeby pobrać ich zainteresowania.

No to by bylo tragiczne, bo mozna to zrobic 2ma sqlkami: 1. pobrac userow, 2. pobrac ich zainteresowania i odpowiednio wyswietlic.


Podstawowe pytanie: jak bedziesz operowal na zainteresowaniach, jesli chcesz robic cos wiecej niz (***) to zapomnij o srednikach.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
f4ll3ns3raf1n
post 18.01.2010, 15:35:51
Post #13





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 27.11.2009

Ostrzeżenie: (0%)
-----


przepraszam ze robię drobne OT, ale problem b. podobnej tematyki.
powiedzcie mi, jak to zrealizować...
klient wybiera sobie do 5 roznych kategorii w drzewku depesza, (myslalem ze na zasadzie <select><option>).
dodanie do tabeli wiele do wielu wpisow polega na:
- pobraniu wszystkich id dzieci wybranej kategorii
- dodaniu do tabeli klientKategorie odpowiedniej ilosci wpisow, oczywiscie sprawdzajac pierw, czy klient nie wybral kategorii powielajacych się....

i teraz nie wiem, czy w tej tabeli przykladowo przy jednej kategorii wybranej, ktora ma 11 dzieci, ma byc az 12 wpisow,
czy drzewko depesza umozliwia inaczej pobierac wszystkie wpisy danej kategorii, uwzgledniajac wpisy kategorii-dzieci ?

Ten post edytował f4ll3ns3raf1n 18.01.2010, 15:38:41
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 09:10