Aquí hay un diseño de la persistencia de una plataforma de redes sociales simple. Actualmente, existen estas tablas:
Aquí están los comandos para crear las tablas.
CREATE TABLE users( id SERIAL PRIMARY KEY, name VARCHAR (50) NOT NULL, username VARCHAR (50) UNIQUE NOT NULL, password VARCHAR (255) NOT NULL, email VARCHAR (255) NOT NULL, bio VARCHAR (255) NOT NULL, followers INTEGER NOT NULL, following INTEGER NOT NULL, picture VARCHAR (255) NOT NULL ) CREATE TABLE posts( id SERIAL PRIMARY KEY, title VARCHAR (255) NOT NULL, picture VARCHAR (255) NOT NULL, description VARCHAR (255) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), likes INTEGER NOT NULL, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE ) CREATE TABLE posts_liked_users( post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE ) CREATE TABLE follows( following_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, followed_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE )
Y aquí está el diagrama:
¿Son correctos el diagrama y el diseño general o falta algo?
Como respuesta a cualquier persona que tenga un problema similar al de la pregunta, refactoricé el diseño en función de algunas sugerencias e investigaciones:
Actualicé los campos VARCHAR
para que sean TEXT
, que es la guía general.
Debido a la normalización , eliminé los followers
y following
de los users
y me likes
de la post
para reducir la redundancia de datos y mejorar la integridad de los datos .
Agregué un campo created_at
en los follows
y posts_liked_users
para mantener el tiempo cuando un usuario siguió a otro o le gustó una publicación.
CREATE TABLE users( id SERIAL PRIMARY KEY, name TEXT NOT NULL, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL, email TEXT NOT NULL, bio TEXT NOT NULL, picture TEXT NOT NULL ) CREATE TABLE posts( id SERIAL PRIMARY KEY, title TEXT NOT NULL, picture TEXT NOT NULL, description TEXT NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE ) CREATE TABLE posts_liked_users( created_at TIMESTAMP NOT NULL DEFAULT NOW(), post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE ) CREATE TABLE follows( created_at TIMESTAMP NOT NULL DEFAULT NOW(), following_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, followed_user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE )
referencias: