02 Modelagem Streaming
A modelagem de dados para um sistema que envolve o cadastro/login de usuários e o upload de conteúdo por criadores deve cobrir aspectos como autenticação, controle de permissões e gerenciamento de conteúdo. Abaixo está uma proposta de modelagem de dados com entidades essenciais.
1. Tabela User (Usuário)
Esta tabela armazenará os dados dos usuários, incluindo informações básicas e de autenticação.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único do usuário. | 
| username | VARCHAR | Nome de usuário, único para cada usuário. | 
| email | VARCHAR | E-mail do usuário, único e usado para login. | 
| password_hash | VARCHAR | Hash da senha do usuário para autenticação. | 
| full_name | VARCHAR | Nome completo do usuário. | 
| profile_pic | VARCHAR | URL da foto de perfil do usuário (opcional). | 
| role | VARCHAR | Função do usuário, como "creator" ou "viewer". | 
| date_joined | DATETIME | Data e hora do cadastro do usuário. | 
| last_login | DATETIME | Última data e hora em que o usuário fez login. | 
| is_active | BOOLEAN | Indica se o usuário está ativo ou foi suspenso. | 
- Descrição: Esta tabela mantém os dados principais dos usuários, incluindo informações de login e permissões.
2. Tabela Content (Conteúdo)
Esta tabela armazenará os dados do conteúdo carregado pelos criadores.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único do conteúdo. | 
| user_id | INT(FK) | Referência ao usuário criador do conteúdo. | 
| title | VARCHAR | Título do conteúdo. | 
| description | TEXT | Descrição detalhada do conteúdo. | 
| file_url | VARCHAR | URL do arquivo de mídia (áudio ou vídeo). | 
| thumbnail_url | VARCHAR | URL da imagem de miniatura do conteúdo. | 
| content_type | VARCHAR | Tipo de conteúdo: "audio" ou "video". | 
| upload_date | DATETIME | Data e hora do upload. | 
| views | INT | Número de visualizações ou plays do conteúdo. | 
| likes | INT | Número de curtidas que o conteúdo recebeu. | 
| is_public | BOOLEAN | Indica se o conteúdo está disponível publicamente. | 
| status | VARCHAR | Status do conteúdo: "published", "draft", "blocked". | 
- Descrição: Armazena os dados de cada conteúdo enviado pelos criadores, incluindo metadados, links de arquivos e status de visibilidade.
3. Tabela Role (Permissões de Usuário)
Tabela para definir diferentes permissões de usuário.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único da função. | 
| role_name | VARCHAR | Nome da função (creator, viewer). | 
| description | TEXT | Descrição das permissões dessa função. | 
- Descrição: Cada usuário pode ter um papel (role), como criador de conteúdo ou visualizador.
4. Tabela Playlist (Playlist)
Usuários podem criar listas de reprodução com o conteúdo carregado.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único da playlist. | 
| user_id | INT(FK) | Referência ao usuário que criou a playlist. | 
| title | VARCHAR | Título da playlist. | 
| description | TEXT | Descrição da playlist. | 
| is_public | BOOLEAN | Indica se a playlist é pública ou privada. | 
| creation_date | DATETIME | Data de criação da playlist. | 
- Descrição: Usuários (criadores ou espectadores) podem organizar conteúdos em playlists.
5. Tabela Content_Playlist (Conteúdo em Playlist)
Relação entre conteúdos e playlists.
| Campo | Tipo | Descrição | 
|---|---|---|
| playlist_id | INT(FK) | Referência à playlist. | 
| content_id | INT(FK) | Referência ao conteúdo. | 
- Descrição: Relaciona conteúdos específicos às playlists criadas por usuários.
6. Tabela Comment (Comentários)
Usuários podem comentar sobre os conteúdos.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único do comentário. | 
| user_id | INT(FK) | Referência ao usuário que fez o comentário. | 
| content_id | INT(FK) | Referência ao conteúdo comentado. | 
| comment_text | TEXT | Texto do comentário. | 
| comment_date | DATETIME | Data e hora do comentário. | 
- Descrição: Cada comentário está associado a um conteúdo e ao usuário que o postou.
7. Tabela Like (Curtidas)
Armazena as curtidas de usuários nos conteúdos.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único da curtida. | 
| user_id | INT(FK) | Referência ao usuário que curtiu o conteúdo. | 
| content_id | INT(FK) | Referência ao conteúdo curtido. | 
| like_date | DATETIME | Data e hora da curtida. | 
- Descrição: Registra as interações de curtidas entre usuários e conteúdos.
8. Tabela Subscription (Assinaturas)
Gerencia as assinaturas dos usuários para acessar conteúdos premium.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único da assinatura. | 
| user_id | INT(FK) | Referência ao usuário que assinou. | 
| start_date | DATETIME | Data de início da assinatura. | 
| end_date | DATETIME | Data de término da assinatura. | 
| status | VARCHAR | Status da assinatura: "active", "canceled", "expired". | 
- Descrição: Registra as assinaturas dos usuários ao serviço para acessarem funcionalidades premium.
9. Tabela View_History (Histórico de Visualização)
Armazena o histórico de consumo de mídia de cada usuário.
| Campo | Tipo | Descrição | 
|---|---|---|
| id | INT(PK) | Identificador único do histórico de visualização. | 
| user_id | INT(FK) | Referência ao usuário que assistiu/escutou o conteúdo. | 
| content_id | INT(FK) | Referência ao conteúdo visualizado/escutado. | 
| view_date | DATETIME | Data e hora em que o conteúdo foi acessado. | 
Relacionamentos principais:
- User-Content: Cada conteúdo é criado por um usuário (relação 1:N).
- User-Playlist: Um usuário pode criar várias playlists (1:N).
- Content-Playlist: Conteúdos podem pertencer a várias playlists e vice-versa (N:M).
- User-Like-Content: Usuários podem curtir vários conteúdos, e cada conteúdo pode receber várias curtidas (N:M).
- User-Comment-Content: Um usuário pode fazer vários comentários sobre diferentes conteúdos (1:N).
Esse modelo cobre os principais aspectos de um sistema de streaming com suporte a login, upload de conteúdo e interações como curtidas e comentários.
Abaixo está a proposta de um diagrama de classes para a modelagem de dados mencionada, considerando as entidades principais, atributos e relacionamentos:
Classes Principais:
- User
- id: int
- username: str
- email: str
- password_hash: str
- full_name: str
- profile_pic: str
- role: str
- date_joined: datetime
- last_login: datetime
- is_active: bool
- 
Métodos: - login()
- register()
- updateProfile()
 
- 
Content 
- id: int
- title: str
- description: str
- file_url: str
- thumbnail_url: str
- content_type: str
- upload_date: datetime
- views: int
- likes: int
- is_public: bool
- status: str
- 
Métodos: - upload()
- deleteContent()
- updateContent()
 
- 
Playlist 
- id: int
- title: str
- description: str
- is_public: bool
- creation_date: datetime
- 
Métodos: - addContent()
- removeContent()
 
- 
Comment 
- id: int
- comment_text: str
- comment_date: datetime
- 
Métodos: - addComment()
- deleteComment()
 
- 
Like 
- id: int
- like_date: datetime
- 
Métodos: - addLike()
- removeLike()
 
- 
Subscription 
- id: int
- start_date: datetime
- end_date: datetime
- status: str
- 
Métodos: - subscribe()
- cancelSubscription()
 
- 
ViewHistory 
- id: int
- view_date: datetime
- Métodos:- addView()
- getHistory()
 
Relacionamentos:
- User - Content:
- Relação 1:N (Um usuário pode criar vários conteúdos).
- 
Um criador de conteúdo ( User) possui uma coleção de conteúdos associados, o que pode ser modelado pela relação de composição entreUsereContent.
- 
User - Playlist: 
- Relação 1:N (Um usuário pode criar várias playlists).
- 
Uma playlist pode conter múltiplos conteúdos, e um usuário pode ser dono de várias playlists. 
- 
Playlist - Content: 
- Relação N:M (Uma playlist pode ter vários conteúdos, e um conteúdo pode estar em várias playlists).
- 
Essa relação pode ser representada por uma classe associativa (ou intermediária), ligando PlaylisteContent.
- 
User - Comment: 
- Relação 1:N (Um usuário pode fazer vários comentários).
- 
Um comentário sempre estará associado a um conteúdo específico. 
- 
User - Like - Content: 
- Relação N:M (Um usuário pode curtir vários conteúdos, e um conteúdo pode ter várias curtidas).
- 
A classe Likeserve como a entidade intermediária, conectandoUsereContent.
- 
User - Subscription: 
- Relação 1:1 (Um usuário pode ter uma assinatura ativa).
- 
O usuário pode se inscrever ou cancelar a assinatura. 
- 
User - ViewHistory - Content: 
- Relação N:M (Um usuário pode assistir a vários conteúdos e um conteúdo pode ser assistido por vários usuários).
- A classe ViewHistoryserve como entidade intermediária.
Diagrama de Classes:
+----------------+       1       +-----------------+       N        +--------------+
|     User       |<----------------|    Content     |<----------------|  Playlist    |
+----------------+                 +-----------------+                +--------------+
| - id           |                 | - id            |                | - id         |
| - username     |                 | - title         |                | - title      |
| - email        |                 | - description   |                | - description|
| - password_hash|                 | - file_url      |                | - is_public  |
| - role         |                 | - content_type  |                | - creation_date|
| - date_joined  |                 | - upload_date   |                +--------------+
+----------------+                 +-----------------+                | addContent() |
| login()        |                 | upload()        |                | removeContent()|
| register()     |                 | deleteContent() |                +--------------+
+----------------+                 +-----------------+
           |                             |
           |                             | N
           | 1                           v
           v                         +----------------+
     +--------------+                 |     Comment    |
     | Subscription |                 +----------------+
     +--------------+                 | - id           |
     | - id         |                 | - comment_text |
     | - start_date |                 | - comment_date |
     | - end_date   |                 +----------------+
     | - status     |                 | addComment()   |
     +--------------+                 | deleteComment()|
     | subscribe()  |                 +----------------+
     | cancelSub()  |
     +--------------+
Explicação do Diagrama:
- User: Centraliza a relação com conteúdos, playlists, curtidas, assinaturas, histórico de visualização e comentários.
- Content: Relaciona-se diretamente com o usuário que o criou e pode estar em várias playlists.
- Playlist: Um usuário pode criar várias playlists, que por sua vez podem conter vários conteúdos.
- Comment e Like: Representam interações dos usuários com os conteúdos.
- Subscription: Relaciona-se diretamente ao usuário, representando seu status de assinatura.
- ViewHistory: Armazena o histórico de visualização do usuário em relação aos conteúdos consumidos.
Este diagrama captura as interações principais entre os dados de usuários, conteúdo e funcionalidades relacionadas ao streaming.
Aqui está o código em PlantUML para o diagrama de classes proposto:
@startuml
class User {
    + int id
    + String username
    + String email
    + String password_hash
    + String full_name
    + String profile_pic
    + String role
    + DateTime date_joined
    + DateTime last_login
    + boolean is_active
    --
    + login()
    + register()
    + updateProfile()
}
class Content {
    + int id
    + String title
    + String description
    + String file_url
    + String thumbnail_url
    + String content_type
    + DateTime upload_date
    + int views
    + int likes
    + boolean is_public
    + String status
    --
    + upload()
    + deleteContent()
    + updateContent()
}
class Playlist {
    + int id
    + String title
    + String description
    + boolean is_public
    + DateTime creation_date
    --
    + addContent()
    + removeContent()
}
class Comment {
    + int id
    + String comment_text
    + DateTime comment_date
    --
    + addComment()
    + deleteComment()
}
class Like {
    + int id
    + DateTime like_date
    --
    + addLike()
    + removeLike()
}
class Subscription {
    + int id
    + DateTime start_date
    + DateTime end_date
    + String status
    --
    + subscribe()
    + cancelSubscription()
}
class ViewHistory {
    + int id
    + DateTime view_date
    --
    + addView()
    + getHistory()
}
User "1" -- "N" Content : "creates"
User "1" -- "N" Playlist : "owns"
Playlist "N" -- "M" Content : "contains"
User "1" -- "N" Comment : "makes"
User "1" -- "N" Like : "likes"
Content "1" -- "N" Comment : "has"
Content "1" -- "N" Like : "has"
User "1" -- "1" Subscription : "subscribes to"
User "1" -- "N" ViewHistory : "views"
Content "1" -- "N" ViewHistory : "viewed by"
@enduml
Você pode copiar esse código e colá-lo em um editor compatível com PlantUML para gerar o diagrama de classes. O diagrama refletirá os relacionamentos e atributos discutidos anteriormente.