Como implementar a ação de retweet do Twitter no meu banco de dados
Estou implementando um aplicativo da web semelhante ao Twitter. Eu preciso implementar ação 'retweet', eum tweet pode ser retweetado por uma pessoa várias vezes.
Eu tenho uma tabela básica de 'tweets' que tem colunas para:
Tweets: tweet_id | tweet_text | tweet_date_created | tweet_user_id
(Ondetweet_id
é a chave primária para tweets,tweet_text
contém texto do tweet,tweet_date_created
é o DateTime quando o tweet foi criado etweet_user_id
é a chave estrangeira parausers
tabela e identifica o usuário que criou o tweet)
Agora eu estou querendo saber como devo implementar a ação de retweet no meu banco de dados.
Opção 1Devo criar uma nova tabela de junção, que ficaria assim:
Retweets: tweet_id | user_id | retweet_date_retweeted
(Ondetweet_id
é uma chave estrangeira paratweets
mesa,user_id
é uma chave estrangeira parausers
tabela e identifica o usuário que retweetou o tweet,retweet_date_retweeted
é um DateTime que especifica quando o retweet foi feito.)
pros: Não haverá colunas vazias, quando o usuário reteet processo, nova linha emretweets
tabela será criada.
contras: O processo de consulta será mais difícil, será necessário juntar duas tabelas e de alguma forma classificar os tweets em duas datas (quando o tweet não for retweet, classifique por tweet_date_created, quando o tweet for retweetado, classifique-o por retweet_date_retweeted).
opção 2Ou devo implementá-lo notweets
mesa comoparent_id
, então ficará assim:
Tweets: tweet_id | tweet_text | tweet_date_created | tweet_user_id | parent_id
(Onde todas as colunas permanecem as mesmas eparent_id
é uma chave estrangeira para o mesmotweets
mesa. Quando o tweet é criado,parent_id
permanece vazio. Quando o tweet é retweetado,parent_id
contém ID de tweet de origem,tweet_user_id
contém usuário que processou a ação de retweet,tweet_date_created
contém o DateTime quando o retweet foi feito etweet_text
permanece vazio - porquenós não vamos permitir que os usuários alterem o tweet original quando retweetam.)
pros: O processo de consulta é muito mais elegante, já que não preciso juntar duas tabelas.
contras: Haverá células vazias toda vez que o tweet for retweetado. Então, se eu tiver 1 000 tweets no meu banco de dados e cada um deles for retweetado por 5 vezes, haverá 5 000 linhas no meutweets
mesa.
Qual é o caminho mais eficiente? É melhor ter células vazias ou ter um processo de consulta mais limpo?