• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

struktura tabeli

0 głosów
87 wizyt
pytanie zadane 10 sierpnia w SQL, bazy danych przez mi-20 Dyskutant (9,230 p.)
Witam, jak powinna wyglądać tabela w bazie danych kiedy chcemy zrealizować dodawanie znajomych, coś takiego jak jest na fb. Do znajomych których nie ma na naszej liście znajomych możemy wysłać zaproszenie, następnie czekamy na akceptację i po akceptacji ta osoba pojawia się na naszej liście.

2 odpowiedzi

+2 głosów
odpowiedź 10 sierpnia przez Storkeus Użytkownik (820 p.)
Ja bym tu chyba zrobił dwie tabele, jedną z danymi użytkowników a drugą z połączeniami między nimi. W tabeli z połączeniami możesz jeszcze przechowywać typ połączenia (np. oczekuje na akceptację, znajomy, zablokowany...)
komentarz 10 sierpnia przez Jackob Użytkownik (770 p.)
Chyba lepszym rozwiązaniem było by 1 tabela do całości i jedna dla każdego użytkownika i w niej rekordy z info o stanie znajomy/zablokowany/akceptacja połączone relacyjnie z główna tabelą. Wprawdzie więcej miejsca zajmie ale optymailzacja/prostota. Każda tabelę nazywaj najlepiej con+idużytkownika i twórz po potwierdzeniu e-mail/innej rzeczy a jeżeli tego nie wymagasz to po rejestracji(wyszukaj id w bazie po loginie).
komentarz 10 sierpnia przez Comandeer Mentor (430,250 p.)
@Jackob to nie ma sensu. Taki model się może sprawdzić w dokumentowej bazie danych, ale nie w relacyjnej.

No i jaka to optymalizacja? Gdy będę miał 10000 użytkowników, to będę mieć co najmniej 10001 tabel. Dodatkowo jak cały ten system ma się zachowywać w chwili, gdy użytkownik zostaje usunięty? W przypadku normalnych relacji robią to za nas klucze obce. W przypadku osobnej tabeli trzeba to robić ręcznie. A żeby zrobić to poprawnie, trzeba to robić w transakcji (żeby usunięcie użytkownika spowodowało wszystkie kolejne, potrzebne kroki i by baza została spójna). Itp., itd.

Takie rozwiązanie nie rozwiązuje żadnych problemów, tylko dokłada kolejnych. Jedynym sensownym rozwiązaniem w przypadku SQL są dwie tabele (lub 3, jeśli potraktujemy zaproszenia jako coś osobnego), z czego druga powinna mieć odpowiednie klucze obce i klucz unikalny na pary id użytkowników.
komentarz 10 sierpnia przez Jackob Użytkownik (770 p.)
Gdy usuwasz użytkownika usuwasz jego tabele i wszystkie rekordy z jego id w tabelach innych z pomocą relacji gdzie jego id w tabeli głównej to klucz obcy w tabelach użytkowników. Po prostu do komórki w tabelach innych userów dajesz id z tabeli użytkowników do logowania. Ja po prostu tworzę i rozwijam mój system. Jeżeli się nie zgadzasz to ok, każdy ma swoje zdanie.
komentarz 10 sierpnia przez Comandeer Mentor (430,250 p.)

Jeżeli się nie zgadzasz to ok, każdy ma swoje zdanie

W ten sposób można przepchnąć każdą złą praktykę, nazywając ją "własnym zdaniem". Jest jednak pewna różnica pomiędzy subiektywnymi opiniami, a opiniami, które zyskały intersubiektywny, społeczny konsensus (jak choćby SOLID czy traktowanie baz SQL jako zbioru relacji a nie obiektów). 

komentarz 10 sierpnia przez Wiciorny Maniak (60,940 p.)
Tworzenie tabeli  dla 1 użytkownika? Ktoś oszalał? To nie jest byt stały, byt ISTOTNY... użytkowników może być tysiące... utworzysz 1000 tabel? Non-sens...

Rekord stanowić powinien użytkownika, a z bazami relacyjnymi bardzo prosto dodać pole np stanowiące związek pomiedzy encjami i ten związek np -> znormalizować na osobną tabele przechowująca samą relacje :)
0 głosów
odpowiedź 10 sierpnia przez Catalonya1992 Gaduła (4,000 p.)
Możesz zrobić jedną tabelę z osobami. Jedną z kolumn tabeli będzie status, np. W - wysłano, Z- zaakceptowano. Na tej tabeli tworzysz widok, gdzie piszesz select * from osoby where status = 'Z'; Widok zwraca Ci to co potrzebujesz. Obsługę dodawania, usuwania znajomych możesz zrealizować triggerem na tabeli osoby.

Podobne pytania

0 głosów
1 odpowiedź 49 wizyt
0 głosów
2 odpowiedzi 76 wizyt
pytanie zadane 9 kwietnia w C i C++ przez lambdag Obywatel (1,290 p.)
0 głosów
1 odpowiedź 83 wizyt
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

54,400 zapytań

98,270 odpowiedzi

202,119 komentarzy

26,715 pasjonatów

Przeglądających: 307
Pasjonatów: 25 Gości: 282

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...