Este tutorial fornece as etapas completas para projetar um esquema de banco de dados do Social Network System para gerenciar os usuários, amigos, seguidores, grupos e mensagens.
O diagrama de relacionamento de entidade ou design de banco de dados visual é mostrado abaixo.
Banco de dados do sistema de rede social
Você também pode visitar os tutoriais populares, incluindo como instalar o MySQL 8 no Ubuntu 20.04 LTS, como instalar o MySQL 8 no Windows, como instalar o MySQL Workbench no Ubuntu, como instalar o MySQL 8 com o Workbench no Windows 10, banco de dados RBAC no MySql, Banco de dados de blog em MySQL, banco de dados de questionário em MySQL, banco de dados de pesquisa e pesquisa em MySQL, banco de dados de carrinho de compras on-line em MySQL, banco de dados de inventário em MySQL e aprender consultas básicas de SQL em MySQL.
Banco de dados do sistema de rede social
O primeiro passo é criar o Banco de Dados do Sistema de Rede Social. Ele pode ser criado usando a consulta conforme mostrado abaixo.
CREATE SCHEMA `sns` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Eu usei o conjunto de caracteres utf8mb4 para suportar uma ampla gama de caracteres.
Tabela de usuário
Nesta seção, projetaremos a Tabela do usuário para armazenar informações do usuário. Abaixo está a descrição de todas as colunas da Tabela de Usuários.
ID | O ID exclusivo para identificar o usuário. |
Nome | O primeiro nome do usuário. |
Nome do meio | O nome do meio do usuário. |
Sobrenome | O sobrenome do usuário. |
Celular | O número de celular do usuário. Ele pode ser usado para fins de login e registro. |
O e-mail do usuário. Ele pode ser usado para fins de login e registro. | |
Hash de senha | O hash de senha gerado pelo algoritmo apropriado. Devemos evitar armazenar senhas simples ou criptografadas. |
Registrado em | Esta coluna pode ser usada para calcular a vida útil do usuário com o aplicativo. |
Último login | Pode ser usado para identificar o último login do usuário. |
Introdução | A breve introdução do usuário. |
Perfil | Detalhes do usuário. |
A Tabela de Usuários com as restrições apropriadas é mostrada abaixo.
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) );
Tabela de amigos do usuário
Nesta seção, projetaremos a Tabela de amigos do usuário para armazenar os amigos do usuário. O status de amigo pode ser usado para rastrear o status de amizade e o tipo pode ser usado para especificar o tipo de amizade. Abaixo está a descrição de todas as colunas da Tabela de Amigos do Usuário.
ID | O ID exclusivo para identificar a amizade. |
ID de origem | O ID do usuário para identificar o usuário que iniciou a amizade. |
ID de destino | O ID de usuário do amigo. |
Tipo | O tipo para classificar amigos. Pode ser Escola, Faculdade ou Conhecido. |
Estado | O status pode ser Novo, Rejeitado ou Ativo. |
Criado em | Ele armazena a data e hora em que a solicitação de amizade foi iniciada. |
Atualizado em | Ele armazena a data e hora em que a solicitação de amizade foi atualizada. |
Observações | Armazena as notas específicas da amizade. |
A tabela de amigos do usuário com as restrições apropriadas é mostrada abaixo.
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`);
Tabela de seguidores do usuário
Nesta seção, projetaremos a Tabela de seguidores do usuário para armazenar os seguidores do usuário. O tipo de seguidor pode ser usado para especificar o tipo de seguidor entre Curtir, Não gostar ou Seguir. Abaixo está a descrição de todas as colunas da Tabela de Seguidores de Usuários.
ID | O ID exclusivo para identificar o seguidor. |
ID de origem | O ID do usuário para identificar o usuário seguidor. |
ID de destino | O ID do usuário para identificar o usuário a seguir. |
Tipo | O tipo para classificar seguidores. Pode ser Curtir, Não Curtir ou Seguir. |
Criado em | Ele armazena a data e hora em que o seguidor foi criado. |
Atualizado em | Ele armazena a data e hora em que o seguidor foi atualizado. |
A Tabela User Follower com as restrições apropriadas é mostrada abaixo.
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`);
Tabela de mensagens do usuário
Nesta seção, projetaremos a Tabela de mensagens do usuário para armazenar as mensagens de bate-papo do usuário. Abaixo está a descrição de todas as colunas da Tabela de Mensagens do Usuário.
ID | O ID exclusivo para identificar a mensagem. |
ID de origem | O ID do usuário para identificar o remetente. |
ID de destino | O ID do usuário para identificar o destinatário. |
Mensagem | O corpo da mensagem. |
Criado em | Ele armazena a data e hora em que a mensagem foi criada. |
Atualizado em | Ele armazena a data e hora em que a mensagem foi atualizada. |
A tabela de mensagens do usuário com as restrições apropriadas é mostrada abaixo.
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;
Tabela de postagem do usuário
Nesta seção, projetaremos a Tabela de postagem do usuário para armazenar as postagens do usuário. O remetente pode ser solicitado a permitir que outros usuários com permissões apropriadas postem no mural do usuário. Abaixo está a descrição de todas as colunas da Tabela de Postagens do Usuário.
ID | O ID exclusivo para identificar a postagem. |
ID de usuário | O ID do usuário para identificar o usuário correspondente. |
ID do remetente | O ID do remetente para identificar o remetente correspondente. |
Mensagem | O corpo da mensagem. |
Criado em | Ele armazena a data e hora em que a postagem foi criada. |
Atualizado em | Ele armazena a data e hora em que a postagem foi atualizada. |
A tabela de postagem do usuário com as restrições apropriadas é mostrada abaixo.
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;
Tabela de Grupo
Nesta seção, projetaremos a Tabela de Grupo para armazenar os dados do grupo. Abaixo está a descrição de todas as colunas da Tabela de Grupos.
ID | O ID exclusivo para identificar o grupo. |
Criado por | O ID do usuário para identificar o usuário que registrou o grupo. |
Atualizado por | O ID do usuário para identificar o usuário que atualizou o grupo. |
Título | O título do grupo. |
Metatítulo | O meta-título a ser usado para o título do navegador e propósitos de SEO. |
Slug | O slug para formar o URL exclusivo. |
Resumo | O resumo para mencionar os principais destaques. |
Estado | O status do grupo pode ser Novo, Aprovado, Ativo ou Bloqueado. |
Criado em | Ele armazena a data e hora em que o grupo foi criado. |
Atualizado em | Ele armazena a data e hora em que o grupo é atualizado. |
Perfil | A coluna usada para armazenar os detalhes do perfil do grupo. |
Conteúdo | A coluna usada para armazenar os detalhes adicionais do grupo. |
Ele usa o status da coluna para rastrear o status do grupo. O status pode ser Novo, Aprovado, Ativo ou Bloqueado. A Tabela de Grupos com as restrições apropriadas é mostrada abaixo.
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;
Meta do Grupo
A Meta Tabela do Grupo pode ser usada para armazenar informações adicionais sobre os grupos, incluindo a URL do banner do grupo, etc. Abaixo está a descrição de todas as colunas da Meta Tabela do Grupo.
ID | O ID exclusivo para identificar a meta do grupo. |
ID do grupo | O ID do grupo para identificar o grupo pai. |
Chave | A chave que identifica o meta. |
Conteúdo | A coluna usada para armazenar os metadados do grupo. |
A Tabela Meta do Grupo com as restrições apropriadas é mostrada abaixo.
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;
Tabela de Membros do Grupo
Nesta seção, projetaremos a Tabela de membros do grupo para armazenar os membros do grupo. O status do membro pode ser usado para rastrear o status da associação e a função do membro pode ser usada para identificar os privilégios do membro. Abaixo está a descrição de todas as colunas da Tabela de Membros do Grupo.
ID | O ID exclusivo para identificar a associação. |
ID do grupo | O ID do grupo para identificar o grupo correspondente. |
ID de usuário | O ID do usuário para identificar o usuário correspondente. |
ID da função | A função para verificar os privilégios do usuário. |
Estado | O status pode ser Novo, Rejeitado, Ativo ou Bloqueado. |
Criado em | Ele armazena a data e hora em que a solicitação do membro foi iniciada. |
Atualizado em | Ele armazena a data e hora em que o membro foi atualizado. |
Observações | Ele armazena as notas específicas da associação. |
A Tabela de Membros do Grupo com as restrições apropriadas é mostrada abaixo.
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`);
Tabela de Seguidores do Grupo
Nesta seção, projetaremos a Tabela de seguidores do grupo para armazenar os seguidores do grupo. O tipo de seguidor pode ser Curtir, Não gostar ou Seguir. Abaixo está a descrição de todas as colunas da Tabela de Seguidores do Grupo.
ID | O ID exclusivo para identificar o seguidor. |
ID do grupo | O ID do grupo para identificar o grupo correspondente. |
ID de usuário | O ID do usuário para identificar o usuário correspondente. |
Tipo | O tipo de seguidor pode ser Curtir, Não gostar ou Seguir. |
Criado em | Ele armazena a data e hora em que o seguidor foi criado. |
Atualizado em | Ele armazena a data e hora em que o seguidor foi atualizado. |
A Tabela de Seguidores de Grupo com as restrições apropriadas é mostrada abaixo.
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`);
Tabela de mensagens de grupo
Nesta seção, projetaremos a Tabela de mensagens de grupo para armazenar as mensagens de bate-papo em grupo. Abaixo está a descrição de todas as colunas da Tabela de Mensagens do Grupo.
ID | O ID exclusivo para identificar a mensagem. |
ID do grupo | O ID do grupo para identificar o grupo correspondente. |
ID de usuário | O ID do usuário para identificar o usuário correspondente. |
Mensagem | O corpo da mensagem. |
Criado em | Ele armazena a data e hora em que a mensagem foi criada. |
Atualizado em | Ele armazena a data e hora em que a mensagem foi atualizada. |
A Tabela de Mensagens do Grupo com as restrições apropriadas é mostrada abaixo.
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;
Tabela de postagens do grupo
Nesta seção, projetaremos a Tabela de postagens do grupo para armazenar as postagens do grupo. Os membros com a função apropriada podem postar no grupo. Abaixo está a descrição de todas as colunas da Tabela Post do Grupo.
ID | O ID exclusivo para identificar a postagem. |
ID do grupo | O ID do grupo para identificar o grupo correspondente. |
ID de usuário | O ID do usuário para identificar o usuário correspondente. |
Mensagem | O corpo da mensagem. |
Criado em | Ele armazena a data e hora em que a postagem foi criada. |
Atualizado em | Ele armazena a data e hora em que a postagem foi atualizada. |
A Tabela de Posts do Grupo com as restrições apropriadas é mostrada abaixo.
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;
Resumo
Neste tutorial, discutimos o projeto de banco de dados de um Sistema de Rede Social para gerenciar os usuários, amigos, seguidores, mensagens e grupos.
Você pode enviar seus comentários para participar da discussão. Você também pode estar interessado em projetar o banco de dados dos aplicativos Blog, Carrinho de compras e Pesquisa e pesquisa. O esquema completo do banco de dados também está disponível no GitHub.