Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Mój pomysł: brak ID w tabeli, Czy rozwiązanie ma jakieś minusy?
Zajec
post
Post #1





Grupa: Zarejestrowani
Postów: 1 086
Pomógł: 8
Dołączył: 10.12.2003

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


Potrzebuję stworzyć tabelę, która będzie kojarzyła ze sobą pozycje dwóch innych tabel:

1) Tabela "users" z id użytkownika i jego danymi
2) Tabela "hobby" z id hobby i nazwą hobby

Chcę, aby każdy użytkownik mógł sobie obrać kilka zdefiniowanych przeze mnie hobby. Tworzę więc tabelę z dwoma polami:
1) user_id
2) hobby_id

Teraz pytanie: Czy jest jakiś silny argument, aby dodawać pole id w tabeli łączącej? Zawsze mnie uczono, że id musi być i że ułatwia pracę, ale w tym przypadku szczerze mówiąc nie widzę zastosowania. Gdy user zmienia hobby po prostu kasuję jego dotychczasową listę hobby i tworzę jeszcze raz. Nie mam potrzeby odwoływania się do konkretnego wiersza tabeli łączącej.

Co więcej boję się, że przy częstej zmianie hobby, wartości jej pól "id" drastycznie urosną mimo ogólnie małej ilości wierszy. Dlatego głównie nie chciałbym dodawać pola "id".

Ten post edytował Zajec 6.04.2007, 23:10:03
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sedziwoj
post
Post #2





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Darti problem nie jest jak mi się wydaje banalny, bo jeśli chcesz wybrać osoby o danym hobby lub nawet kilku to nie jest problem.
Jednak gdy chcesz wybrać osoby o takich samych zainteresowaniach to pamiętaj że każdy może mieć inną długość listy hobby więc dla każdej osoby wybierasz takie które mają taką samą, takich osób może być kilka.
Więc wybierasz osobę i jej zainteresowania np.:
user_id|hobby_id
1|1
1|2
1|3
potem szukasz osoby która ma te zainteresowania, ale tu tracę pomysł jak...
albo mam błędne założenia od początku. Ale wynikiem końcowym będzie tablica o dwóch polach user_id gdzie obaj użytkownicy mają te same hobby (przy czym będzie coś w stylu 1|2 i 2|1 z powodu że to jest relacja dwu kierunkowa)

Mam małe doświadczenie w tworzeniu zapytań i jeszcze nie czytałem żadnej porządnej książki o tym :|

Coś wykombinowałem, działa, ale optymalności to pewnie ani ciut, ciut nie ma:
  1. SELECT `nalezy`.`u_id`,`zawiera`.`u_id` FROM (SELECT `max`.`u_id`,`sum`.`t_u` FROM (SELECT `u2`.`u_id`,count(*) AS `x` FROM `ush` AS `u2` GROUP BY `u2`.`u_id`) AS `max`
  2. JOIN (SELECT `ush`.`u_id` AS `f_u`,`u`.`u_id` AS `t_u`, COUNT(`u`.`h_id`) AS `ile` FROM `ush` LEFT JOIN `ush` AS `u` ON `u`.`h_id`=`ush`.`h_id` GROUP BY `ush`.`u_id`,`u`.`u_id`) AS `sum`
  3. ON (`max`.`x`=`sum`.`ile` AND `max`.`u_id`=`sum`.`f_u`)) AS `nalezy`
  4. LEFT JOIN (SELECT `max`.`u_id`,`sum`.`t_u` FROM (SELECT `u2`.`u_id`,count(*) AS `x` FROM `ush` AS `u2` GROUP BY `u2`.`u_id`) AS `max`
  5. JOIN (SELECT `ush`.`u_id` AS `f_u`,`u`.`u_id` AS `t_u`, COUNT(`u`.`h_id`) AS `ile` FROM `ush` LEFT JOIN `ush` AS `u` ON `u`.`h_id`=`ush`.`h_id` GROUP BY `ush`.`u_id`,`u`.`u_id`) AS `sum`
  6. ON (`max`.`x`=`sum`.`ile` AND `max`.`u_id`=`sum`.`f_u`)) AS `zawiera`
  7. ON (`nalezy`.`t_u`=`zawiera`.`u_id` AND `nalezy`.`u_id`=`zawiera`.`t_u`)
  8. WHERE `nalezy`.`u_id`<`zawiera`.`u_id`


proste nieprawdaż?

i i tabelka taka:
  1. CREATE TABLE `ush` (
  2. `u_id` int(11) NOT NULL,
  3. `h_id` int(11) NOT NULL,
  4. PRIMARY KEY (`u_id`,`h_id`)
  5. )


jak macie lepsze pomysły piszcie.

EDIT próba aby trochę połamało zapytanie

Ten post edytował Sedziwoj 16.05.2007, 23:32:27
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 31.12.2025 - 16:47