# Banco de Dados | Oblivion

# Modelo Entidade Relacionamento (MER)

### Sobre o Banco de Dados

Este é um modelo de banco de dados projetado para um **sistema de processamento e transcrição de mídias**.

O fluxo principal do sistema parece ser o seguinte:

1. Um **Usuário** envia (faz upload) de um arquivo de **Mídia**.
2. Essa **Mídia** pode ser de três tipos específicos: um **Vídeo**, um **Áudio** ou um link de uma **URL** externa (como um vídeo do YouTube).
3. O sistema processa a **Mídia** e **gera** uma **Transcrição** do seu conteúdo.
4. Durante a transcrição, o sistema identifica os diferentes **Participantes** (vozes ou pessoas) na mídia e os associa à transcrição correspondente.

É um sistema robusto para serviços que convertem fala em texto (Speech-to-Text), legendagem automática, ou análise de conteúdo de áudio e vídeo.

[![Banco de Dados | MER OBLIVION](https://bookstack.ljit.com.br/uploads/images/gallery/2025-10/scaled-1680-/TIiqcOd4FTVeTgsa-imagem-do-whatsapp-de-2025-10-06-as-14-22-20-18bf8ada.jpg)](https://bookstack.ljit.com.br/uploads/images/gallery/2025-10/TIiqcOd4FTVeTgsa-imagem-do-whatsapp-de-2025-10-06-as-14-22-20-18bf8ada.jpg)

# Modelo Lógico

# Modelo Lógico (MongoDB) - Projeto OBLIVION

Este documento descreve a estrutura das coleções e documentos para o banco de dados MongoDB do projeto OBLIVION. Ele serve como a "fonte da verdade" para a estrutura de dados que será implementada.

---

### Coleção: `usuarios`

Armazena os dados de cada usuário cadastrado no sistema.

<table class="code-line" data-line="12" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o"><thead class="code-line" data-line="12" dir="auto"><tr class="code-line" data-line="12" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th><th>Observações</th></tr></thead><tbody class="code-line" data-line="14" dir="auto"><tr class="code-line" data-line="14" dir="auto"><td>`_id`</td><td>ObjectId</td><td>Identificador único gerado pelo MongoDB.</td><td>Chave Primária.</td></tr><tr class="code-line" data-line="15" dir="auto"><td>`nome`</td><td>String</td><td>Nome completo do usuário.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="16" dir="auto"><td>`email`</td><td>String</td><td>Email do usuário para login e contato.</td><td>Obrigatório, **Índice Único**.</td></tr><tr class="code-line" data-line="17" dir="auto"><td>`dataCadastro`</td><td>ISODate</td><td>Data e hora do cadastro do usuário.</td><td>Obrigatório.</td></tr></tbody></table>

---

### Coleção: `midias`

Armazena os metadados de qualquer fonte de mídia enviada (vídeo, áudio ou URL), implementando a generalização através do campo `tipo`.

<table class="code-line" data-line="25" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o-1"><thead class="code-line" data-line="25" dir="auto"><tr class="code-line" data-line="25" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th><th>Observações</th></tr></thead><tbody class="code-line" data-line="27" dir="auto"><tr class="code-line" data-line="27" dir="auto"><td>`_id`</td><td>ObjectId</td><td>Identificador único da mídia.</td><td>Chave Primária.</td></tr><tr class="code-line" data-line="28" dir="auto"><td>`usuarioId`</td><td>ObjectId</td><td>Referência ao `_id` do usuário que fez o upload.</td><td>Chave Estrangeira (Obrigatório).</td></tr><tr class="code-line" data-line="29" dir="auto"><td>`hash`</td><td>String</td><td>Hash (ex: SHA-256) do conteúdo do arquivo.</td><td>**Índice Único**. Nulo se `tipo`="URL".</td></tr><tr class="code-line" data-line="30" dir="auto"><td>`urlNormalizada`</td><td>String</td><td>URL padronizada para evitar duplicidade de links.</td><td>**Índice Único**. Existe apenas se `tipo`="URL".</td></tr><tr class="code-line" data-line="31" dir="auto"><td>`tipo`</td><td>String</td><td>Tipo da mídia: "VIDEO", "AUDIO", ou "URL".</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="32" dir="auto"><td>`nomeArquivo`</td><td>String</td><td>Nome original do arquivo enviado.</td><td>Não aplicável se `tipo`="URL".</td></tr><tr class="code-line" data-line="33" dir="auto"><td>`tamanhoBytes`</td><td>Number</td><td>Tamanho do arquivo em bytes.</td><td> </td></tr><tr class="code-line" data-line="34" dir="auto"><td>`tipoArquivo`</td><td>String</td><td>MIME type do arquivo (ex: "video/mp4").</td><td>Não aplicável se `tipo`="URL".</td></tr><tr class="code-line" data-line="35" dir="auto"><td>`duracaoMs`</td><td>Number</td><td>Duração do conteúdo em milissegundos.</td><td> </td></tr><tr class="code-line" data-line="36" dir="auto"><td>`dataUpload`</td><td>ISODate</td><td>Data e hora do envio.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="37" dir="auto"><td>`resolucao`</td><td>String</td><td>Resolução do vídeo (ex: "1920x1080").</td><td>Opcional (existe apenas se `tipo`="VIDEO").</td></tr><tr class="code-line" data-line="38" dir="auto"><td>`canais`</td><td>String</td><td>Canais do áudio (ex: "stereo").</td><td>Opcional (existe apenas se `tipo`="AUDIO").</td></tr><tr class="code-line" data-line="39" dir="auto"><td>`linkOriginal`</td><td>String</td><td>A URL original enviada pelo usuário.</td><td>Opcional (existe apenas se `tipo`="URL").</td></tr><tr class="code-line" data-line="40" dir="auto"><td>`plataforma`</td><td>String</td><td>Plataforma de origem da URL (ex: "YouTube").</td><td>Opcional (existe apenas se `tipo`="URL").</td></tr></tbody></table>

---

### Coleção: `transcricoes`

Armazena o estado e o resultado de cada processo de transcrição.

<table class="code-line" data-line="48" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o-2"><thead class="code-line" data-line="48" dir="auto"><tr class="code-line" data-line="48" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th><th>Observações</th></tr></thead><tbody class="code-line" data-line="50" dir="auto"><tr class="code-line" data-line="50" dir="auto"><td>`_id`</td><td>ObjectId</td><td>Identificador único da transcrição.</td><td>Chave Primária.</td></tr><tr class="code-line" data-line="51" dir="auto"><td>`midiaId`</td><td>ObjectId</td><td>Referência à `_id` da mídia que está sendo transcrita.</td><td>Chave Estrangeira (Obrigatório). **Índice**.</td></tr><tr class="code-line" data-line="52" dir="auto"><td>`status`</td><td>String</td><td>Status do job: "pendente", "processando", "concluido", "erro".</td><td>Obrigatório. **Índice**.</td></tr><tr class="code-line" data-line="53" dir="auto"><td>`textoCompleto`</td><td>String</td><td>O texto final da transcrição.</td><td> </td></tr><tr class="code-line" data-line="54" dir="auto"><td>`dataCriacao`</td><td>ISODate</td><td>Data e hora do início do job.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="55" dir="auto"><td>`dataAtualizacao`</td><td>ISODate</td><td>Data e hora da última atualização de status.</td><td>Obrigatório.</td></tr><tr class="code-line" data-line="56" dir="auto"><td>`participantes`</td><td>Array de Objetos</td><td>Lista dos participantes identificados no texto.</td><td>Ver schema embutido abaixo.</td></tr></tbody></table>

#### Schema Embutido: `participantes`

O campo `participantes` é um array de objetos, onde cada objeto segue a estrutura:

<table class="code-line" data-line="62" dir="auto" id="bkmrk-campo-tipo-descri%C3%A7%C3%A3o-3"><thead class="code-line" data-line="62" dir="auto"><tr class="code-line" data-line="62" dir="auto"><th>Campo</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody class="code-line" data-line="64" dir="auto"><tr class="code-line" data-line="64" dir="auto"><td>`individuoDetectado`</td><td>String</td><td>Nome/rótulo do locutor (ex: "Locutor A").</td></tr><tr class="code-line" data-line="65" dir="auto"><td>`trechosRelacionados`</td><td>Array de Objetos</td><td>Lista de trechos de fala daquele indivíduo.</td></tr></tbody></table>

# Modelo Físico