Este tutorial proporciona los pasos completos para diseñar un esquema de base de datos del sistema de red social para administrar los usuarios, amigos, seguidores, grupos y mensajes.
El Diagrama de Relación de Entidades o el diseño de la base de datos visual se muestra a continuación.
Base de datos del sistema de redes sociales
También puede visitar los tutoriales populares que incluyen Cómo instalar MySQL 8 en Ubuntu 20.04 LTS, Cómo instalar MySQL 8 en Windows, Cómo instalar MySQL Workbench en Ubuntu, Cómo instalar MySQL 8 con Workbench en Windows 10, Base de datos RBAC en MySql, Base de datos de blog en MySql, base de datos de cuestionarios en MySQL, base de datos de encuestas y sondeos en MySQL, base de datos de carrito de compras en línea en MySQL, base de datos de inventario en MySQL y aprenda consultas SQL básicas en MySQL.
Base de datos del sistema de redes sociales
El primer paso es crear la base de datos del sistema de redes sociales. Se puede crear usando la consulta como se muestra a continuación.
CREATE SCHEMA `sns` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
He usado el conjunto de caracteres utf8mb4 para admitir una amplia gama de caracteres.
Tabla de usuarios
En esta sección, diseñaremos la Tabla de usuarios para almacenar información del usuario. A continuación se menciona la descripción de todas las columnas de la tabla de usuarios.
Id | La identificación única para identificar al usuario. |
Nombre | El nombre del usuario. |
Segundo Nombre | El segundo nombre del usuario. |
Apellido | El apellido del usuario. |
Móvil | El número de móvil del usuario. Se puede utilizar con fines de inicio de sesión y registro. |
Correo electrónico | El correo electrónico del usuario. Se puede utilizar con fines de inicio de sesión y registro. |
Hash de contraseña | El hash de contraseña generado por el algoritmo apropiado. Debemos evitar almacenar contraseñas simples o encriptadas. |
Registrado en | Esta columna se puede utilizar para calcular la vida del usuario con la aplicación. |
Último inicio de sesión | Se puede utilizar para identificar el último inicio de sesión del usuario. |
Introducción | La breve introducción del Usuario. |
Perfil | Detalles del usuario. |
La tabla de usuarios con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `sns`.`user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`firstName` VARCHAR(50) NULL DEFAULT NULL,
`middleName` VARCHAR(50) NULL DEFAULT NULL,
`lastName` VARCHAR(50) NULL DEFAULT NULL,
`username` VARCHAR(50) NULL DEFAULT NULL,
`mobile` VARCHAR(15) NULL,
`email` VARCHAR(50) NULL,
`passwordHash` VARCHAR(32) NOT NULL,
`registeredAt` DATETIME NOT NULL,
`lastLogin` DATETIME NULL DEFAULT NULL,
`intro` TINYTEXT NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_username` (`username` ASC),
UNIQUE INDEX `uq_mobile` (`mobile` ASC),
UNIQUE INDEX `uq_email` (`email` ASC) );
Tabla de amigos del usuario
En esta sección, diseñaremos la Tabla User Friend para almacenar los amigos del usuario. El estado de amigo se puede usar para rastrear el estado de amistad y el tipo se puede usar para especificar el tipo de amistad. A continuación se menciona la descripción de todas las columnas de la tabla User Friend.
Id | La identificación única para identificar la amistad. |
Id. de la fuente | La identificación de usuario para identificar al usuario que inició la amistad. |
Id. de destino | La identificación de usuario del amigo. |
Tipo | El tipo para clasificar amigos. Puede ser Escuela, Universidad o Conocido. |
Estado | El estado puede ser Nuevo, Rechazado o Activo. |
Creado en | Almacena la fecha y hora en que se inició la solicitud de amistad. |
Actualizado en | Almacena la fecha y hora en que se actualizó la solicitud de amistad. |
Notas | Almacena las notas específicas de la amistad. |
A continuación se muestra la tabla User Friend con las restricciones adecuadas.
CREATE TABLE `sns`.`user_friend` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`notes` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_friend_source` (`sourceId` ASC),
CONSTRAINT `fk_friend_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_friend`
ADD INDEX `idx_friend_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_friend`
ADD CONSTRAINT `fk_friend_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`user_friend` ADD UNIQUE `uq_friend`(`sourceId`, `targetId`);
Tabla de seguidores de usuarios
En esta sección, diseñaremos la Tabla de seguidores de usuarios para almacenar los seguidores del usuario. El tipo de seguidor se puede usar para especificar el tipo de seguidor entre Me gusta, No me gusta o Seguir. A continuación se menciona la descripción de todas las columnas de la Tabla de seguimiento de usuarios.
Id | La identificación única para identificar al seguidor. |
Id. de la fuente | El ID de usuario para identificar al usuario seguidor. |
Id. de objetivo | La identificación de usuario para identificar al siguiente usuario. |
Tipo | El tipo para clasificar a los seguidores. Puede ser Me gusta, No me gusta o Seguir. |
Creado en | Almacena la fecha y hora en que se creó el seguidor. |
Actualizado en | Almacena la fecha y hora en que se actualizó el seguidor. |
La tabla de seguidores de usuarios con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `sns`.`user_follower` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_ufollower_source` (`sourceId` ASC),
CONSTRAINT `fk_ufollower_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_follower`
ADD INDEX `idx_ufollower_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_follower`
ADD CONSTRAINT `fk_ufollower_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`user_follower` ADD UNIQUE `uq_ufollower`(`sourceId`, `targetId`, `type`);
Tabla de mensajes de usuario
En esta sección, diseñaremos la Tabla de mensajes de usuario para almacenar los mensajes de chat del usuario. A continuación se menciona la descripción de todas las columnas de la tabla de mensajes de usuario.
Id | La identificación única para identificar el mensaje. |
Id. de la fuente | El ID de usuario para identificar al remitente. |
Id. de destino | La identificación de usuario para identificar al receptor. |
Mensaje | El cuerpo del mensaje. |
Creado en | Almacena la fecha y hora en que se creó el mensaje. |
Actualizado en | Almacena la fecha y hora en que se actualizó el mensaje. |
La tabla de mensajes de usuario con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `sns`.`user_message` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`sourceId` BIGINT NOT NULL,
`targetId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_umessage_source` (`sourceId` ASC),
CONSTRAINT `fk_umessage_source`
FOREIGN KEY (`sourceId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_message`
ADD INDEX `idx_umessage_target` (`targetId` ASC);
ALTER TABLE `sns`.`user_message`
ADD CONSTRAINT `fk_umessage_target`
FOREIGN KEY (`targetId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Tabla de publicaciones de usuario
En esta sección, diseñaremos la tabla de publicaciones de usuarios para almacenar las publicaciones de los usuarios. Es posible que se requiera que el remitente permita que otros usuarios con los permisos apropiados publiquen en el muro de usuarios. A continuación se menciona la descripción de todas las columnas de la tabla de publicaciones de usuarios.
Id | La identificación única para identificar la publicación. |
ID de usuario | El ID de usuario para identificar al usuario correspondiente. |
Id del remitente | La identificación del remitente para identificar al remitente correspondiente. |
Mensaje | El cuerpo del mensaje. |
Creado en | Almacena la fecha y hora en que se creó la publicación. |
Actualizado en | Almacena la fecha y hora en que se actualizó la publicación. |
A continuación se muestra la tabla de publicaciones de usuarios con las restricciones adecuadas.
CREATE TABLE `sns`.`user_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`userId` BIGINT NOT NULL,
`senderId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_upost_user` (`userId` ASC),
CONSTRAINT `fk_upost_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`user_post`
ADD INDEX `idx_upost_sender` (`senderId` ASC);
ALTER TABLE `sns`.`user_post`
ADD CONSTRAINT `fk_upost_sender`
FOREIGN KEY (`senderId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Mesa de grupo
En esta sección diseñaremos la Mesa de Grupo para almacenar los datos del grupo. A continuación se menciona la descripción de todas las columnas de la Tabla de grupos.
Id | La identificación única para identificar el grupo. |
Creado por | El ID de usuario para identificar al usuario que registró el grupo. |
Actualizado por | La identificación de usuario para identificar al usuario que actualizó el grupo. |
Título | El título del grupo. |
Metatítulo | El metatítulo que se usará para el título del navegador y fines de SEO. |
Babosa | El slug para formar la URL única. |
Resumen | El resumen para mencionar los aspectos más destacados. |
Estado | El estado del grupo puede ser Nuevo, Aprobado, Activo o Bloqueado. |
Creado en | Almacena la fecha y hora en que se crea el grupo. |
Actualizado en | Almacena la fecha y hora en que se actualiza el grupo. |
Perfil | La columna utilizada para almacenar los detalles del perfil del grupo. |
Contenido | La columna utilizada para almacenar los detalles adicionales del grupo. |
Utiliza el estado de la columna para realizar un seguimiento del estado del grupo. El estado puede ser Nuevo, Aprobado, Activo o Bloqueado. La tabla de grupos con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `sns`.`group` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`createdBy` BIGINT NOT NULL,
`updatedBy` BIGINT NOT NULL,
`title` VARCHAR(75) NOT NULL,
`metaTitle` VARCHAR(100) NULL,
`slug` VARCHAR(100) NOT NULL,
`summary` TINYTEXT NULL,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`profile` TEXT NULL DEFAULT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uq_slug` (`slug` ASC),
INDEX `idx_group_creator` (`createdBy` ASC),
CONSTRAINT `fk_group_creator`
FOREIGN KEY (`createdBy`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group`
ADD INDEX `idx_group_modifier` (`updatedBy` ASC);
ALTER TABLE `sns`.`group`
ADD CONSTRAINT `fk_group_modifier`
FOREIGN KEY (`updatedBy`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Metagrupo
La metatabla de grupos se puede utilizar para almacenar información adicional sobre grupos, incluida la URL del banner del grupo, etc. A continuación se menciona la descripción de todas las columnas de la metatabla de grupos.
Id | La identificación única para identificar el grupo meta. |
Id. de grupo | La identificación del grupo para identificar el grupo principal. |
Clave | La clave que identifica el meta. |
Contenido | La columna utilizada para almacenar los metadatos del grupo. |
La metatabla de grupo con las restricciones apropiadas se muestra a continuación.
CREATE TABLE `sns`.`group_meta` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`key` VARCHAR(50) NOT NULL,
`content` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_meta_group` (`groupId` ASC),
UNIQUE INDEX `uq_meta_group` (`groupId` ASC, `key` ASC),
CONSTRAINT `fk_meta_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Tabla de miembros del grupo
En esta sección, diseñaremos la Tabla de miembros del grupo para almacenar los miembros del grupo. El estado del miembro se puede usar para realizar un seguimiento del estado de la membresía y el rol del miembro se puede usar para identificar los privilegios del miembro. A continuación se menciona la descripción de todas las columnas de la Tabla de miembros del grupo.
Id | La identificación única para identificar la membresía. |
Id. de grupo | La identificación del grupo para identificar el grupo correspondiente. |
ID de usuario | El ID de usuario para identificar al usuario correspondiente. |
Id. de función | El rol para comprobar los privilegios de los usuarios. |
Estado | El estado puede ser Nuevo, Rechazado, Activo o Bloqueado. |
Creado en | Almacena la fecha y hora en que se inició la solicitud de miembro. |
Actualizado en | Almacena la fecha y hora en que se actualizó el miembro. |
Notas | Almacena las notas específicas de la membresía. |
La tabla de miembros del grupo con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `sns`.`group_member` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`status` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
`notes` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_member_group` (`groupId` ASC),
CONSTRAINT `fk_member_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_member`
ADD INDEX `idx_member_user` (`userId` ASC);
ALTER TABLE `sns`.`group_member`
ADD CONSTRAINT `fk_member_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`group_member` ADD UNIQUE `uq_friend`(`groupId`, `userId`);
Tabla de seguidores de grupo
En esta sección, diseñaremos la Tabla de Seguidores de Grupo para almacenar los seguidores del grupo. El tipo de seguidor puede ser Me gusta, No me gusta o Seguir. A continuación se menciona la descripción de todas las columnas de la Tabla de seguidores del grupo.
Id | La identificación única para identificar al seguidor. |
Id. de grupo | La identificación del grupo para identificar el grupo correspondiente. |
ID de usuario | El ID de usuario para identificar al usuario correspondiente. |
Tipo | El tipo de seguidor puede ser Me gusta, No me gusta o Seguir. |
Creado en | Almacena la fecha y hora en que se creó el seguidor. |
Actualizado en | Almacena la fecha y hora en que se actualizó el seguidor. |
A continuación se muestra la tabla de seguidores de grupo con las restricciones adecuadas.
CREATE TABLE `sns`.`group_follower` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`type` SMALLINT NOT NULL DEFAULT 0,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gfollower_group` (`groupId` ASC),
CONSTRAINT `fk_gfollower_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_follower`
ADD INDEX `idx_gfollower_user` (`userId` ASC);
ALTER TABLE `sns`.`group_follower`
ADD CONSTRAINT `fk_gfollower_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ALTER TABLE `sns`.`group_follower` ADD UNIQUE `uq_friend`(`groupId`, `userId`, `type`);
Tabla de mensajes de grupo
En esta sección, diseñaremos la Tabla de Mensajes de Grupo para almacenar los mensajes de chat de grupo. A continuación se menciona la descripción de todas las columnas de la tabla de mensajes de grupo.
Id | La identificación única para identificar el mensaje. |
Id. de grupo | La identificación del grupo para identificar el grupo correspondiente. |
ID de usuario | El ID de usuario para identificar al usuario correspondiente. |
Mensaje | El cuerpo del mensaje. |
Creado en | Almacena la fecha y hora en que se creó el mensaje. |
Actualizado en | Almacena la fecha y hora en que se actualizó el mensaje. |
La tabla de mensajes de grupo con las restricciones adecuadas se muestra a continuación.
CREATE TABLE `sns`.`group_message` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gmessage_group` (`groupId` ASC),
CONSTRAINT `fk_gmessage_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_message`
ADD INDEX `idx_gmessage_user` (`userId` ASC);
ALTER TABLE `sns`.`group_message`
ADD CONSTRAINT `fk_gmessage_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Mesa de mensajes de grupo
En esta sección, diseñaremos la Tabla de publicaciones grupales para almacenar las publicaciones del grupo. Los miembros que tengan el rol apropiado pueden publicar en el grupo. A continuación se menciona la descripción de todas las columnas de la tabla de publicaciones grupales.
Id | La identificación única para identificar la publicación. |
Id. de grupo | La identificación del grupo para identificar el grupo correspondiente. |
ID de usuario | El ID de usuario para identificar al usuario correspondiente. |
Mensaje | El cuerpo del mensaje. |
Creado en | Almacena la fecha y hora en que se creó la publicación. |
Actualizado en | Almacena la fecha y hora en que se actualizó la publicación. |
A continuación se muestra la tabla de publicación de grupo con las restricciones adecuadas.
CREATE TABLE `sns`.`group_post` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`groupId` BIGINT NOT NULL,
`userId` BIGINT NOT NULL,
`message` TINYTEXT NULL DEFAULT NULL,
`createdAt` DATETIME NOT NULL,
`updatedAt` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_gpost_group` (`groupId` ASC),
CONSTRAINT `fk_gpost_group`
FOREIGN KEY (`groupId`)
REFERENCES `sns`.`group` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ALTER TABLE `sns`.`group_post`
ADD INDEX `idx_gpost_user` (`userId` ASC);
ALTER TABLE `sns`.`group_post`
ADD CONSTRAINT `fk_gpost_user`
FOREIGN KEY (`userId`)
REFERENCES `sns`.`user` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Resumen
En este tutorial, hemos discutido el diseño de la base de datos de un sistema de red social para administrar usuarios, amigos, seguidores, mensajes y grupos.
Puede enviar sus comentarios para unirse a la discusión. También te puede interesar diseñar la base de datos de las aplicaciones Blog, Carrito de compras y Encuestas. El esquema completo de la base de datos también está disponible en GitHub.