Zabawne, że jeszcze tego nie widziałem!Wiele-do-wielu na tym samym stole
Nigdy nie przyszło mi do głowy, że można mieć stosunek "wielu do wielu" przy jednym stole - dopóki nie zacząłem pracować nad systemem, w którym użytkownicy mogą się "zaprzyjaźnić" ze sobą (sieci społecznościowe).
Standardowa tabela przeglądowa, przynajmniej w taki sposób, w jakim jestem przyzwyczajona, nie jest tutaj odpowiednia. Pozwala na proste:
Tabela użytkownika ma kolumnę "id" i "nazwa".
Tabela zależności użytkownika zawiera "uid1" i "uid2", reprezentujące użytkowników będących "przyjaciółmi" lub "pąków" lub "znajomych" lub "cokolwiek innego".
Szybko staje się oczywiste, jaki jest tu problem: uid1 i uid2 to ten sam typ danych z tej samej kolumny z tej samej tabeli, co oznacza, że unikalne klucze stają się wadliwe.
Np uid1 = 1 uid2 = 2
jest taka sama jak:
uid1 = 2 uid2 = 1
I dlatego mógł wrócić 2 rekordy lub 0 rekordy jeśli zapytanie jest wykonane nieprawidłowo.
W duchu dobrego zaprojektowania tabeli nie chcę skanować całej tabeli dwukrotnie, aby sprawdzić istniejące wartości.
Czy istnieje jakaś sztuczka do radzenia sobie z tym? To jest pytanie projektowe, które nigdy nie przyszło mi do głowy, i to mnie irytuje, ponieważ wiem, że jest jakaś prosta sztuczka, aby to zadziałało.
Zanim zapytasz, nie próbowałem niczego, ponieważ już widzę, że mój ulubiony sposób porównywania rzeczy (tabele przeglądowe) jest niewystarczający dla moich potrzeb tutaj i potrzebuję pomocy - nie mogę znaleźć niczego .. na SO lub Google :(
z góry dzięki
O co pytasz? – Umbrella
Możesz * mieć * relację M-M między tabelą a nią samą, używając tej samej metody "stołu stolarskiego", jak w przypadku każdej innej relacji M-m. – Umbrella
Oczywiście możesz mieć m-m w jednej tabeli - gdzie użytkownicy odnoszą się do siebie. Think facebook lub myspace lub cokolwiek innego, wielu użytkowników może mieć wielu przyjaciół jako użytkowników - jest to relacja wiele do wielu na samym stole użytkownika, a nie między dwiema tabelami. @Umbrella Pytam, jak powiązać użytkowników ze sobą - jak to zrobić, aby uniknąć duplikowania wpisów. Będę edytować, aby było bardziej jasne. – dudewad