sql >> Base de Datos >  >> RDS >> Mysql

Guía para diseñar bases de datos para sistemas de redes sociales en MySQL

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.