Я реализую веб-приложение, похожее на Twitter. Мне нужно реализовать действие «ретвитнуть», и один твит может быть ретвитнут одним человеком несколько раз .
У меня есть базовая таблица «твитов», в которой есть столбцы для:
Tweets: tweet_id | tweet_text | tweet_date_created | tweet_user_id
(где tweet_id
— первичный ключ для твитов, tweet_text
содержит текст твита, tweet_date_created
— дата и время создания твита, а tweet_user_id
— внешний ключ к таблице users
и идентифицирует пользователя, создавшего твит )
. ] Теперь мне интересно, как мне реализовать действие ретвита в моей базе данных.
Должен ли я создать новую таблицу соединений, которая будет выглядеть так:
Retweets: tweet_id | user_id | retweet_date_retweeted
(Где tweet_id
— внешний ключ к таблице tweets
, user_id
— внешний ключ к таблице users
и идентифицирует пользователя, ретвитнувшего твит, retweet_date_retweeted
— DateTime, указывающее, когда был сделан ретвит.)
плюсы:Пустых столбцов не будет, при повторном запуске пользовательского процесса будет создана новая строка в таблице retweets
.
минусы:Процесс запроса будет сложнее, нужно будет объединить две таблицы и каким-то образом отсортировать твиты по двум датам (, когда твит не ретвитят, сортировать по твиту _дате _создания, когда твит ретвитят, сортировать это ретвит _дата _ретвит ).
Или я должен реализовать это в таблице tweets
как parent_id
, тогда это будет выглядеть так:
Tweets: tweet_id | tweet_text | tweet_date_created | tweet_user_id | parent_id
(Где все столбцы остаются прежними, а parent_id
является внешним ключом к той же таблице tweets
. При создании твита parent_id
остается пустым. Когда твит ретвитят, parent_id
содержит идентификатор исходного твита, tweet_user_id
содержит пользователя, обработавшего действие ретвита, tweet_date_created
содержит DateTime, когда ретвит был сделан,и tweet_text
остается пустым -, потому что мы не позволим пользователям изменять исходный твит при ретвите .)
плюсы:Процесс запроса намного элегантнее, так как мне не нужно объединять две таблицы.
минусы:Каждый раз, когда твит ретвитят, будут пустые ячейки. Итак, если у меня в базе данных 1000 твитов и каждый из них ретвитят 5 раз, в моей таблице tweets
будет 5000 строк.
Какой самый эффективный способ? Лучше иметь пустые ячейки или сделать процесс запроса более чистым?