![]() |
![]() |
![]()
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 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 359 Pomógł: 1 Dołączył: 16.04.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Oczywiście że id nie musi być. Id jest potrzebne tylko po to aby zidentyfikować wpis (np. gdy chcemy go usunąć) Najlepszym rozwiązaniem będzie chyba zrobienie tej tabeli jako dwóch kolum które dodatkowo są PK, co zapobiegnie zduplikowaniu wpisu...
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Zalezy w jakiej bazie - sa takie gdzie mozna zdefiniowac aby para wartosci byla unikalna
![]() -------------------- Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 086 Pomógł: 8 Dołączył: 10.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za odpowiedź. Pominę w takim razie id.
(Baza: MySQL) Najlepszym rozwiązaniem będzie chyba zrobienie tej tabeli jako dwóch kolum które dodatkowo są PK, co zapobiegnie zduplikowaniu wpisu... PK: Politechnika Poznańska KB PK Biblioteka PK Polski Katalog Panorama Kultur Tyle zasugerowało Google. A co Ty miałeś na myśli? ;-) Ten post edytował Zajec 7.04.2007, 09:47:20 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 380 Pomógł: 2 Dołączył: 5.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
primary key....
-------------------- Wybierasz się do Zakopanego? Odwiedź Willę Pod Górami. Następnym razem na pewno do niej wrócisz :)
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 12.04.2007 Skąd: Błonie Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem czy dobrze rozumuje, ale...
Jeśli chodzi ci o to aby każdy użytkownik miał w bazie więcej niż jedno hobby to niezbędna ci będzie tabela składająca relacje - jest to klasyczny przypadek encji wiele - do wielu, która nie ma prawa istnieć zgodnie z teorią relacyjnych baz danych. Możesz tak: USERS UserID | Name | Cośtam HOBBYS HobID | Hobby Name HobbysOfUsers AutoID | UID (to klucz UserID z tabeli USERS) | HID (analogiczny z HOBBYS) pozdr. |
|
|
![]()
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%) ![]() ![]() |
Zajac: nie musisz robic IDka.
Cytat Id jest potrzebne tylko po to aby zidentyfikować wpis (np. gdy chcemy go usunąć) Patrz nizej: nie jest potrzebny Cytat Najlepszym rozwiązaniem będzie chyba zrobienie tej tabeli jako dwóch kolum które dodatkowo są PK, co zapobiegnie zduplikowaniu wpisu... a szukasz rekordu jednoczesnie po user_id i hobby_id i masz jednoznacznie okreslony rekord -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 076 Pomógł: 62 Dołączył: 6.03.2005 Skąd: Wroc Ostrzeżenie: (0%) ![]() ![]() |
A ciekawi mnie przypadek, kiedy chcesz wybrać dwóch użytkowników z takimi samymi hobby (np żeby stworzyć 'wspólne koło zainteresowań). Jak wyglądałoby zapytanie w projekcie od @Zajec
![]() -------------------- The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1 MySQL Client API version : 5.0.27 |
|
|
![]()
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%) ![]() ![]() |
Tylko dwoch?
-------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 076 Pomógł: 62 Dołączył: 6.03.2005 Skąd: Wroc Ostrzeżenie: (0%) ![]() ![]() |
@dr_bonzo coś Twoja metoda nie działa, zmontowałem na szybko takie dwie tabelki:
i wmontowałem Twoje (podobne) zapytanie (pomińmy że miało być dwóch) :
Powinien wyświetlić tylko userów: pierwszy, drugi (bo mają zainteresowania 1,2,3) a wmieszał się tam jeszcze trzeci dziwnym trafem (bo ma tylko i wyłącznie zainteresowanie 3, ale się wkręcił na imprezkę i nie ma o czym gadać z pierwszym i drugim bo zeszli na tematy 1 lub 2 i trzeciemu grozi picie browara i rwanie lasek koło baru a chciał pogadać ![]() -------------------- The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1 MySQL Client API version : 5.0.27 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Darti co nagle to po diable, co prawda tabela z samymi hobby jak i user są niepotrzebne, bo ważne są id obu.
A wybranie dwóch osób, o takim samych hobby wcale nie jest takie proste. Ja chwilowo widzę tylko taką możliwość, że dla danego użytkownika szukamy innych o tych samych zainteresowaniach. Ponieważ jak widz chcesz pełne pokrycie zbiorów zainteresowań. Wracając do tematu, id jest w tym przypadku zbędne, i ogólnie jak możemy określić unikalne pole lub ich kombinacji, tu UNIGUE(user_id,hobby_id), ale czasem jak jest albo nie możliwe wybranie unikalnych, lub dla prostoty użytkowania dodaje się id. Dla prostoty: załóżmy że mamy tabele osób i każda ma PESEL (bo tak wynika z wymagań że jest zawsze podany) i można w ten sposób unikalnie identyfikować daną osobę, ale po pierwsze łączenie po polu pesel jest niewygodne i wytwarza o wiele więcej danych (bo każda powiązana musiała by mieć cały pesel), do tego udostępnia pesel osoby a takie dane są objęte ochroną, po drugie możliwe jest że ktoś wprowadzi błędny, a potem będzie chciał poprawić, jak już będzie w wielu miejscach, chyba każdy wie co by to znaczyło. Tu mamy wewnętrzną identyfikację i prostą unikalność, do tego do tej tabeli nie podłączmy innych do unikalnego rekordu więc można (ale nie musimy) sobie darować pole id. -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 1 076 Pomógł: 62 Dołączył: 6.03.2005 Skąd: Wroc Ostrzeżenie: (0%) ![]() ![]() |
Tzn z mojego punktu widzenia ważna jest jedynie tabela 'hobbies', nie interesuje mnie to, jak nazywa się dany user (wystarczy mi ID).
Borykam się z tym problemem (braku unikalnej kolumny - nie mogę zmienić struktury tabel) od dosyć dawna. Kombinowałem poprzez złączenie dwukrotnie jednej, tej samej tabeli (np pierwsza.hobby_id=druga.hobby_id) ale dawało mi w efekcie elementy 'niepełne' (tutaj niepełne zainteresowania trzeciej osoby). Temat jest dla mnie niezwykle intrygujący ... po prostu nie lubię wiedzieć że czegoś nie wiem ![]() Pomóżcie proszę zapytaniem SQL .... -------------------- The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1 MySQL Client API version : 5.0.27 |
|
|
![]()
Post
#13
|
|
![]() 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:
proste nieprawdaż? i i tabelka taka:
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 -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 1 076 Pomógł: 62 Dołączył: 6.03.2005 Skąd: Wroc Ostrzeżenie: (0%) ![]() ![]() |
@Sedziwoj jesteś geniuszem w tym temacie
![]() działa doskonale, Dzięki wielkie ![]() -------------------- The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1 MySQL Client API version : 5.0.27 |
|
|
![]()
Post
#15
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
1. Darti: sorry za blad; zle zrozumialem twoja prosbe (mialem wszystkich wypisac userow z jednym, ustalonym hobby -- zapomnialem o WHERE
2. Sedziwoj: WOW, jak ty sie w tym nie pogubiles ![]() 3. [chyba zaraz dopisze] edit: albo i nie bedzie, nie mam teraz czasu -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
2. Sedziwoj: WOW, jak ty sie w tym nie pogubiles ![]() Tylko czy nie można lepiej tego zrobić, to jedynie mnie martwi... A co do optymalizacji to po prostu stworzenie tymczasowej tabeli, bo w sumie łączem dwie takie same (LEFT JOIN) więc po co dwa razy używać skomplikowanego zapytania. I nadal czekam na konstruktywną krytykę, bo może da się coś poprawić, albo ma metoda od założenia była błędna... -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 02:00 |