• 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
108 wizyt
pytanie zadane 10 sierpnia 2018 w SQL, bazy danych przez mi-20 Stary wyjadacz (10,460 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 2018 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 2018 przez Jackob Obywatel (1,430 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 2018 przez Comandeer Mentor (461,660 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 2018 przez Jackob Obywatel (1,430 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 2018 przez Comandeer Mentor (461,660 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 2018 przez Wiciorny Maniak (66,480 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 2018 przez Catalonya1992 Mądrala (5,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ź 94 wizyt
pytanie zadane 11 czerwca 2018 w SQL, bazy danych przez emeryt68 Nowicjusz (130 p.)
0 głosów
2 odpowiedzi 96 wizyt
pytanie zadane 9 kwietnia 2018 w C i C++ przez lambdag Obywatel (1,290 p.)
0 głosów
1 odpowiedź 92 wizyt
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

66,384 zapytań

113,137 odpowiedzi

239,498 komentarzy

46,642 pasjonatów

Przeglądających: 266
Pasjonatów: 1 Gości: 265

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.

...