Для организации хранения данных новостной ленты социальной сети в PostgreSQL, вам понадобится определить структуру таблиц и использовать соответствующие типы данных для хранения информации.
Основная таблица, в которой будут храниться новости, может иметь следующую структуру:
CREATE TABLE news ( id SERIAL PRIMARY KEY, user_id INT NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT NOW(), FOREIGN KEY (user_id) REFERENCES users (id) );
В этой таблице есть колонки:
- id
- уникальный идентификатор новости, который является первичным ключом;
- user_id
- идентификатор пользователя, который опубликовал новость. В этой таблице должна быть внешняя ключ, чтобы связать новости с пользователями;
- content
- текстовое содержимое новости;
- created_at
- дата и время создания новости. Устанавливается значение по умолчанию как текущая дата и время.
Теперь давайте рассмотрим, как хранить связи между пользователями и новостями для организации новостной ленты.
Одним из способов является хранение списка подписок пользователей на других пользователей. Для этого можно создать таблицу подписок со следующей структурой:
CREATE TABLE subscriptions ( id SERIAL PRIMARY KEY, user_id INT NOT NULL, following_user_id INT NOT NULL, FOREIGN KEY (user_id) REFERENCES users (id), FOREIGN KEY (following_user_id) REFERENCES users (id) );
В этой таблице есть колонки:
- id
- уникальный идентификатор подписки, который является первичным ключом;
- user_id
- идентификатор пользователя, который подписан на другого пользователя. В этой таблице должен быть внешняя ключ, чтобы связать подписки с пользователями;
- following_user_id
- идентификатор пользователя, на которого подписан пользователь. В этой таблице также должен быть внешняя ключ, чтобы связать подписки с пользователями.
Когда пользователь публикует новость, вы должны добавить эту новость в новостные ленты всех пользователей, которые подписаны на этого пользователя.
Для этого можно создать таблицу новостной ленты с использованием следующей структуры:
CREATE TABLE news_feed ( id SERIAL PRIMARY KEY, user_id INT NOT NULL, news_id INT NOT NULL, FOREIGN KEY (user_id) REFERENCES users (id), FOREIGN KEY (news_id) REFERENCES news (id) );
В этой таблице есть колонки:
- id
- уникальный идентификатор записи новостной ленты, который является первичным ключом;
- user_id
- идентификатор пользователя, для которого предназначена эта запись новостной ленты. В этой таблице должен быть внешняя ключ, чтобы связать новостную ленту с пользователями;
- news_id
- идентификатор новости, которая отображается в новостной ленте пользователя. В этой таблице должен быть внешняя ключ, чтобы связать новостную ленту с новостями.
Когда пользователь подписывается на других пользователей, вы должны создать соответствующую запись в таблице подписок. При этом, из новостей подписываемого пользователя, вы должны добавить записи в новостную ленту подписчика.
Для отображения новостной ленты конкретного пользователя, вы можете выполнить запрос, который объединяет таблицы пользователей, подписок и новостей, чтобы получить список новостей, отсортированный по дате создания:
SELECT news.* FROM news_feed JOIN news ON news.id = news_feed.news_id WHERE news_feed.user_id = {user_id} ORDER BY news.created_at DESC;
В этом запросе {user_id}
- идентификатор пользователя, для которого вы хотите получить новостную ленту.
Это лишь одно из возможных решений хранения данных для новостной ленты социальной сети в PostgreSQL. Решение может быть уточнено в зависимости от требований вашего проекта.