Dariusz L.

Dariusz L. programista/
specjalista ds. IT

Temat: optymalna tabela uzytkownicy_kontakty

dotyczy MySQL i późniejszego zastosowania w PHP

Struktura:
id
idUser1
idUser2
status

Przy każdym wyciągnięciu będę łączył tę tabelę z tabelą użytkowników celem wyciągnięcia imienia, pytanie brzmi:

ile rekordów wkładać do tabeli dla każdego "kontaktu"?

opcja 1)
insert(idUser1,idUser2,0)
insert(idUser2,idUser1,0)

opcja 2)
insert(idUser1,idUser2,0)

Pierwsza będzie potrzebować 2x więcej rekordów aniżeli druga, jednakże łatwym inner joinem wyciągnę imię... Które rozwiązanie jest lepsze? A może jest jeszcze inne?Dariusz L. edytował(a) ten post dnia 05.06.09 o godzinie 15:26
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: optymalna tabela uzytkownicy_kontakty

Dariusz L.:
Pierwsza będzie potrzebować 2x więcej rekordów aniżeli druga, jednakże łatwym inner joinem wyciągnę imię...

A z drugiej nie? Jaka jest roznica miedzy pierwsza a druga opcja? Czy chodzi o to, ze jesli user1 jest kontaktem dla user2,to automatycznie user2 jest kontaktem dla user 1?Bartosz S edytował(a) ten post dnia 05.06.09 o godzinie 15:39
Dariusz L.

Dariusz L. programista/
specjalista ds. IT

Temat: optymalna tabela uzytkownicy_kontakty

Wydaje mi się, że nie, gdyż

SELECT u.imie 
FROM users u
INNER JOIN users_kontakty uk
ON u.id=uk.idUser2
WHERE uk.idUser1=JA


w tym zapytaniu łączę po idUser2, a ja jestem idUser1 i powiedzmy, ze to ma sens, jak ja dodam kogos do znajomych (wtedy ja ląduje jako idUser1, a zaproszony jako idUser2), ale jak on doda mnie, to ja bede idUser2 (a on idUser1) i wtedy już zapytanie jest bez sensu

nie wiem czy dobrze wytłumaczyłem swoją myśl :)

Czy chodzi o to, ze jesli user1 jest kontaktem dla user2,to automatycznie user2 jest kontaktem dla user 1?
tak, właśnie w tym lezy mój problem :)Dariusz L. edytował(a) ten post dnia 05.06.09 o godzinie 15:41
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: optymalna tabela uzytkownicy_kontakty

To moim zdaniem tylko opcja 1 - ze wzgledu na status. Zakladajac oczywiscie, ze status moze byc rozny dla obu stron kontaktu. Jesli ma byc zawsze ten sam to obie opcje maja sens, nie wiem ktora bedzie szybsza przy duzej ilosci rekordow. Opcja 1 ma tez ta zalete, ze jest bardziej elastyczna (jesli bedziesz mial taka potrzebe to mozesz dorzucic pole ktore bedzie rozne dla kazdej ze stron kontaktu)

Ale niech sie wypowiedza tutejsi SQLowi wymiatacze, bo ja to humanista jestem ;)Bartosz S edytował(a) ten post dnia 05.06.09 o godzinie 15:53
Dariusz L.

Dariusz L. programista/
specjalista ds. IT

Temat: optymalna tabela uzytkownicy_kontakty

dodam, ze status bedzie identyczny:
jak zapraszany zaakceptuje zaproszenie, to wtedy dopiero mozna uwazac sie za znajomego :) Gdyby to miało pomóc to niezatwierdzone kontakty moge trzymac w innej tabeli i w ogole wywalic kolumne 'status'

docelowo, ilosc rekordow bedzie duza (a któż nie ma marzeń ;)), stąd zalezy mi na róznych aspektach, a głównie na prędkości działania.

zakładam, że w opcji (2) muszę zrobić dwa zapytania, raz łącząc po idUser1, a raz po idUser2.Dariusz L. edytował(a) ten post dnia 05.06.09 o godzinie 15:59
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: optymalna tabela uzytkownicy_kontakty

Dariusz L.:
zakładam, że w opcji (2) muszę zrobić dwa zapytania, raz łącząc po idUser1, a raz po idUser2.

Tak, np:


select user2 from kontakty where user1 = 2
union
select user1 from kontakty where user2 = 2


zwroci wszystkie kontakty usera o id 2. Teraz np

SELECT imie FROM userzy
JOIN (SELECT user2 AS id FROM kontakty WHERE user1 = 2
UNION
SELECT user1 AS id FROM kontakty WHERE user2 = 2) as kontakty
on kontakty.id = userzy.id


I masz wszystkie imiona. Albo mozesz joina dac w samych selectach ktore potem laczysz przy pomocy UNION. Cos w ten desen:


SELECT users.imie FROM users, kontakty
where kontakty.user1 =2
and kontakty.user2 = users.userid
UNION
SELECT users.imie FROM users, kontakty
where kontakty.user2 = 2
and kontakty.user1 = users.userid


Albo w jakis jeszcze inny sposob :)Bartosz S edytował(a) ten post dnia 05.06.09 o godzinie 16:43
Przemysław Krygier

Przemysław Krygier Specjalista Systemów
Informatycznych

Temat: optymalna tabela uzytkownicy_kontakty

Witam
Każde z rozwiązań działa. Ale nie widzę powodów aby wstawiać 2 rekordy. Mała sugestia: wszędzie należy używać jednoznacznie brzmiących nazw zatem


id
idUser1
idUser2
status


raczej bym przemodelował na (dla prostoty po polsku):


id_uzytkownicy_zaprosil,
id_uzytkownicy_zaproszony,
data_zaproszenia,
zaproszenie_zaakceptowane,
data_zaakceptowania,
archiwalny,
data_przeniesienia_do_archiwum


Generalnie chcąc się dowiedzieć:

1. Kogo zaprosił dany użytkownik należy zapytać:

SELECT * FROM kontakty WHERE id_uzytkownicy_zaprosil = @id


2. Przez kogo został zaproszony zaprosił dany użytkownik należy zapytać:

SELECT * FROM kontakty WHERE id_uzytkownicy_zaproszony = @id


3. Jak wygląda lista kontaktów użytkownika:


SELECT id_uzytkownicy_zaprosil as id_uzytkownicy_kontakt
FROM kontakty
WHERE id_uzytkownicy_zaproszony = @id
AND zaproszenie_zaakceptowane = 1 AND archiwalny = 0

UNION ALL

SELECT id_uzytownicy_zaproszony as id_uzytkownicy_kontakt
FROM kontakty
WHERE id_uzytkownicy_zaprosil = @id
AND zaproszenie_zaakceptowane = 1 AND archiwalny = 0


Pozdrawiam
Przemek
Adam W.

Adam W. senior php
developer, Symfony

Temat: optymalna tabela uzytkownicy_kontakty

Dariusz L.:
dotyczy MySQL i późniejszego zastosowania w PHP

Struktura:
id
idUser1
idUser2
status

a potrzebna Ci jest konkretnie informacja o obydwóch userach?
przecież na stronie usera gdzie wypisujesz kontakty nie potrzeba już dołączać tego jednego usera, tylko ten kontakt:) więc łączysz tylko 1 raz tabelę z userami.
ja stosuję właśnie to I rozwiązanie z dwoma kolumnami: iduser1 i iduser2
Dariusz L.

Dariusz L. programista/
specjalista ds. IT

Temat: optymalna tabela uzytkownicy_kontakty

Adam W.:
a potrzebna Ci jest konkretnie informacja o obydwóch userach?
przecież na stronie usera gdzie wypisujesz kontakty nie potrzeba już dołączać tego jednego usera, tylko ten kontakt:) więc łączysz tylko 1 raz tabelę z userami.
ja stosuję właśnie to I rozwiązanie z dwoma kolumnami: iduser1 i iduser2
zgadza się - to rozwiązanie jest najprostsze z kazdego punktu widzenia :) Tym niemniej sprawia, ze kazdy "kontakt" zajmuje 2 rekordy w bazie danych (bo raz ja musze byc idUser1 a raz idUser2), chyba, ze czegos nie zrozumiałem...

Następna dyskusja:

Dynamiczna tabela




Wyślij zaproszenie do