Jak wdrożyć akcję Twittera retweet w mojej bazie danych
Wdrażam aplikację internetową podobną do Twittera. Muszę wdrożyć akcję „retweet” ijeden tweet może być wielokrotnie przesłany przez jedną osobę.
Mam podstawową tabelę „tweety”, która zawiera kolumny dla:
Tweety: tweet_id | tweet_text | tweet_date_created | tweet_user_id
(gdzietweet_id
jest kluczem podstawowym dla tweetów,tweet_text
zawiera tekst tweet,tweet_date_created
jest DateTime, kiedy został utworzony tweet itweet_user_id
jest kluczem obcym dousers
i identyfikuje użytkownika, który utworzył tweeta)
Teraz zastanawiam się, jak powinienem wdrożyć akcję retweet w mojej bazie danych.
opcja 1Czy powinienem utworzyć nową tabelę łączenia, która wyglądałaby tak:
Retweets: tweet_id | id_użytkownika | retweet_date_retweeted
(Gdzietweet_id
jest kluczem obcym dotweets
stół,user_id
jest kluczem obcym dousers
i identyfikuje użytkownika, który podał dalej tweet,retweet_date_retweeted
to DateTime, który określa, kiedy został wykonany retweet.)
plusy: Nie będzie pustych kolumn, gdy użytkownik przetwarza reteet, nowa linia wretweets
tabela zostanie utworzona.
Cons: Proces zapytania będzie trudniejszy, będzie musiał połączyć dwie tabele i jakoś posortować tweety według dwóch dat (gdy tweet nie jest ponownie przesyłany, posortuj go przez tweet_date_created, gdy tweet jest ponownie przesyłany, posortuj go przez retweet_date_retweeted).
Opcja 2Czy powinienem go zaimplementować wtweets
stół jakparent_id
, będzie wtedy wyglądać tak:
Tweety: tweet_id | tweet_text | tweet_date_created | tweet_user_id | ID rodzica
(Gdzie wszystkie kolumny pozostają takie same iparent_id
jest kluczem obcym do tego samegotweets
stół. Gdy tworzony jest tweet,parent_id
pozostaje pusty. Gdy tweet jest przesyłany dalej,parent_id
zawiera pochodzenie tweet id,tweet_user_id
zawiera użytkownika, który przetworzył akcję retweet,tweet_date_created
zawiera DateTime, kiedy zrobiono retweet, itweet_text
pozostaje pusty - bonie pozwolimy użytkownikom zmieniać oryginalnego tweeta podczas ponownego wysyłania.)
plusy: Proces zapytania jest o wiele bardziej elegancki, ponieważ nie muszę łączyć dwóch stołów.
Cons: Będą puste komórki za każdym razem, gdy tweet zostanie ponownie przesłany. Jeśli więc w mojej bazie danych mam 1 000 tweetów, a każdy z nich jest przesłany ponownie 5 razy, w moim przypadku będzie 5 000 liniitweets
stół.
Który sposób jest najbardziej wydajny? Czy lepiej jest mieć puste komórki lub czyścić proces zapytania?