PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO DE JANEIRO
INF1383 – BANCO DE DADOS I – 2015.1 - PROF. SÉRGIO LIFSCHITZ
T1 - RELATÓRIO DO PROJETO DE BANCO DE DADOS
Ian Albuquerque Raymundo da Silva – Matrícula: 1310451
Isabella Corbo Ramalho de Mello – Matrícula: 1310390
Samuel Bastos de Souza Junior – Matrícula: 1311416
Victor Augusto Lima Lins de Souza – Matrícula: 1310784
WeMagine
1
– TEXTO DESCRITIVO E REQUISITOS DO PROJETO
O WeMagine é uma aplicação que serve como um “Banco Internacional de Ideias”, no qual os
usuários votam nas ideias criadas por outros usuários. Usuários cadastrados podem colocar
suas próprias ideias disponíveis para serem avaliadas por outras pessoas do mundo todo ou
ainda criar grupos para discutir ideias internamente. Ideias são classificadas em temas, que
organizam os assuntos e agem como filtro de busca. Além disso, o usuário pode comprar
aparências para a aplicação, permitindo sua personalização.
1.1 – Requisitos de Dados
Devo guardar as informações de cada usuário registrado no aplicativo. Essas informações
consistem em um e-mail, único para cada usuário, uma senha, um nome, uma reputação e a data
em que o usuário foi cadastrado na aplicação.
Devo também armazenar as informações de cada ideia registrada no aplicativo. Devo
armazenar, para cada ideia, sua descrição e um número sequencial único que a identifica das
demais.
Devo saber, para cada ideia, qual usuário a criou. Uma ideia é criada necessariamente por um
e somente um usuário enquanto que um mesmo usuário pode criar mais de uma ideia. Contudo,
nem todo usuário é criador de uma ideia. Também devo saber a data em que cada ideia foi criada.
Também é importante manter registro de que ideias já foram visualizadas por cada usuário
para que não haja repetição das ideias exibidas. Uma ideia pode ser visualizada por vários usuários
Página 1 / 23
enquanto que um usuário pode visualizar várias ideias. Contudo, não é necessário que um usuário já
tenha visualizado alguma ideia assim como não é preciso que uma ideia seja visualizada por algum
usuário. Necessito também saber a data em que cada visualização ocorre.
Desejo armazenar o voto que cada usuário dá a cada ideia. Um usuário pode votar em várias
ideias enquanto que uma ideia pode ser votada por vários usuários. Nem todo usuário precisa votar
em alguma ideia e nem toda ideia precisa possuir algum voto de um usuário. De um voto, necessito
saber a data em que o voto ocorreu e o tipo do voto (ideia engraçada, ideia boa, ideia criativa, ideia
ruim, entre outras).
Um usuário pode denunciar uma ideia caso julgue ela imprópria. Devo portanto, armazenar
essas denúncias, incluindo quem a fez e quais ideias foram denunciadas. Um usuário pode
denunciar várias ideias enquanto que uma mesma ideia pode ser denunciada por vários usuários.
Existem ideias que não serão denunciadas e existem usuários que nunca denunciarão. De uma
denúncia, desejo saber uma descrição, a data em que ela ocorreu e a categoria (o tipo) da denúncia
(palavras impróprias, idioma errado, erro de gramática, entre outras).
Quero armazenar também se uma ideia é privada ou não a um usuário. Nem todas ideias são
privadas, mas caso uma ideia seja privada, ela é privada a somente um usuário. Já um usuário não
precisa possuir nenhuma ideia associada como privada a sua conta. Contudo, caso queira, ele pode
possuir várias ideias privadas.
Devo armazenar as informações dos idiomas trabalhados pela aplicação. De um idioma, devo
conhecer seu nome e sua sigla, que o identifica unicamente.
Toda ideia deve estar associada a exatamente um idioma. Ao mesmo tempo, um mesmo
idioma pode estar associado a várias ideias diferentes. Contudo, não é necessário que todo idioma
possua alguma ideia associada a ele.
Devo armazenar para cada usuário os idiomas que ele compreende. Todo usuário deve
compreender pelo menos um idioma. Um mesmo usuário pode compreender vários idiomas. Já um
mesmo idioma pode ser compreendido por vários usuários. Porém, existem idiomas que não são
compreendidos por nenhum usuário.
No aplicativo, devo também armazenar temas de ideias. Cada tema de ideia possui um nome,
único entre os temas.
Toda ideia deve possuir necessariamente pelo menos um tema. Podem existir ideias
associadas a mais de um tema. Já um tema pode estar associado a várias ideias mas não é
necessário que ele esteja associado a alguma ideia.
Página 2 / 23
No aplicativo, devo estabelecer semanas em que definirei ‘Temas da Semana’. De uma
semana, devo saber sua data de início e sua data de fim, assim como o seu número sequencial
único que a identifica unicamente, diferenciando-a das outras semanas.
Toda semana possui um tema que é elegido como seu ‘Tema da Semana’. Toda semana
deve possuir um e somente um tema como ‘Tema da Semana’. Já um mesmo tema, pode ser
escolhido como ‘Tema da Semana’ para diversas semanas. Contudo, não é necessário que todo
tema seja o ‘Tema da Semana’ de alguma semana.
Também existirão diversas aparências (temas visuais) para o aplicativo que o usuário poderá
comprar. Devo armazenar de cada aparência o seu nome, único entre as aparências, o seu preço e
uma sucinta descrição.
Devo manter registro de todas as comprar feitas por usuários. Um usuário pode comprar
várias aparências enquanto que uma aparência pode ser comprada por vários usuários distintos.
Contudo, podem existir usuários que nunca compraram aparências e aparências que nunca foram
compradas por usuários. De uma compra, devo armazenar a data em que ela foi realizada.
Além dos usuários convencionais, devem existir também administradores, que possuirão uma
plataforma totalmente diferente. Administradores não são usuários e usuários não são
administradores (um administrador não vota em uma ideia, por exemplo). Contudo, desejo
armazenar dos administradores o e-mail, único entre os administradores, a senha e o nome do
administrador.
Desejo manter registro das ações tomadas pelos administradores.
Um administrador pode bloquear ideias. Toda ideia ou está bloqueada por um único
administrador ou não está bloqueada por nenhum administrador. Já um administrador pode bloquear
várias ideias. Porém, nem todo administrador precisa bloquear alguma ideia. De um bloqueio, é
necessário saber a data em que o bloqueio ocorreu.
Um administrador também pode banir um usuário, tirando dele o direito de acesso ao
aplicativo. Essa medida possui caráter temporário. Portanto, devo armazenar dela a data de início da
medida e a duração. Um mesmo usuário pode possuir um histórico que possua vários banimentos.
Já um administrador pode banir diversos usuários. Também é verdade que nem todo usuário já foi
banido e que nem todo administrador já baniu algum usuário.
Um administrador pode notificar um usuário. Um usuário pode possuir várias notificações
enquanto que um administrador pode notificar diversos usuários. Porém, nem todos usuários
possuem alguma notificação de um administrador e nem todo administrador já notificou algum
Página 3 / 23
usuário. De uma notificação desejo armazenar seu título, uma descrição e a data em que a
notificação ocorreu.
Os usuários do WeMagine podem formar grupos colaborativos. Devo armazenar o nome e a
descrição de cada grupo. Os nomes dos grupos devem ser únicos para cada grupo.
Devo saber que usuário criou cada grupo. Todo grupo é criado por um e somente um usuário.
Já um usuário pode criar vários grupos. Não é necessário que todo usuário crie algum grupo.
Desejo saber também quem são os organizadores de cada grupo. Todo grupo deve possuir
pelo menos um usuário como organizador. É possível que um grupo possua vários organizadores. Já
um usuário pode ser organizador de vários grupos. Existem usuários que não são organizadores de
nenhum grupo.
De um grupo, também devo saber os membros participantes. Um grupo deve
necessariamente possuir pelo menos um participante. Grupos podem possuir vários usuários como
participantes. Já um usuário pode participar de vários grupos. Porém, não é necessário que todos
usuários participem de algum grupo. Desejo também saber a data em que cada usuário passou a ser
participante de um grupo.
Deseja-se saber também quem adicionou que usuário a que grupos. Um usuário participante
de um grupo foi adicionado por até um usuário. Contudo, nem todos usuários participantes de um
grupo (o criador, por exemplo), foi adicionado por alguém. Já um usuário pode adicionar várias
pessoas a grupos. Contudo, existem usuários que nunca adicionaram outros usuários a nenhum
grupo.
Uma usuário pode associar uma ideia a um grupo que ele participa. Não é necessário
armazenar que usuário associa que ideias a que grupos, mas é importante manter a informação de
que ideias estão associadas a que grupos. Uma ideia, se estiver associada a algum grupo, estará
associada a um único grupo. Contudo, nem toda ideia está associada a algum grupo. Já um grupo
pode possuir várias ideias associadas a ele. Porém, existem grupos que não possuem nenhuma
ideia associada.
Da mesma forma, usuários podem tornar ideias privadas a um grupo. Não é necessário saber
que usuário torna que ideias privadas a que grupos, mas preciso armazenas a informação de que
ideias são privadas a que grupos. Uma ideia, se for privada a algum grupo, é privada a somente um
grupo. Existem ideias que não são privadas a nenhum grupo. Já grupos podem possuir várias ideias
privadas a ele. Ainda assim, existem grupos que não possuem nenhuma ideia privada.
Página 4 / 23
1.2 – Requisitos Funcionais
Pessoas devem ser capazes de se cadastrarem no sistema como usuários com os dados
necessários para se ter um usuário. Devem também ser capazes se entrar no sistema com seu email e senha.
Ao entrar no sistema, o usuário deve ser levado imediatamente a visualização de uma ideia
que esteja escrita em algum idioma que ele compreenda e que ele não tenha visualizado ainda.
Além disso, somente aparecerão ideias que não sejam privadas nem para um usuário nem para um
grupo. Ao lado da ideia, aparece o nome do criador da ideia o do grupo a que a ideia esteja
associado. Ele deve ser capaz de escolher entre opções pré-definidas de votos ou a opção de “Pular
Ideia”. Caso ele vote, um voto será registrado em seu nome para a ideia associada. Caso ele
escolha a opção “Pular Ideia”, nenhum voto é registrado. Em ambos os casos, a ideia é considerada
como visualizada.
Também deve estar disponível para o usuário uma opção de criar ideia. Para criar uma ideia,
o usuário deve entrar com as informações necessárias definidas para a existência de uma ideia. Ele
também deve poder escolher se a ideia será pública ou privada a ele. Caso seja privada, essa
informação deve ser registrada e mostrada na tela, junto com a ideia. Uma ideia somente pode ser
privada a um usuário se esta for criada por ele.
Deve estar disponível ao usuário uma tela com somente as ideias criadas por ele. Nesta tela
devem ser possível selecionar as ideias e visualizar quantos votos de cada tipo cada ideia sua
recebeu. Também deve ser possível deletar uma ideia do sistema. Caso uma ideia seja privada, é
possível torna-la pública. Contudo, uma vez pública, não é possível torna-la privada.
Também deve ser possível ao usuário criar grupos e adicionar outros usuários a este através
de seus e-mails. Ao criar um grupo, este passa ter somente o usuário criador como único
participante. Necessariamente, ao criar o grupo, o criador é um organizador do grupo. Todo
organizador do grupo pode adicionar pessoas ao grupo, assim como alterar as informações do grupo
e as ideias associadas a ele. Um organizador também deve poder excluir pessoas do grupo.
Deve ser possível a todo participante do grupo criar novas ideias que estarão associadas ao
grupo. O criador da ideia ainda passa a ser o indivíduo que a criou, porém esta passa a estar
associada ao grupo e com acesso disponível a todos os membros do grupo. Ao criar essa ideia, é
possível escolher para a ideia ser privada para dentro do grupo ou não. Em ambos os casos, todos
os membros do grupo podem votar nas ideias do grupo (contudo, somente podem votar uma única
vez por ideia).
Página 5 / 23
A qualquer momento, caso um usuário do WeMagine encontre uma ideia que seja
inapropriada segundo seu julgamento, este pode denunciar a ideia, escolhendo entre categorias prédefinidas de tipos de denúncias. Exemplos de categorias são Linguagem Imprópria e Idioma
Incorreto.
O usuário também deve ser capaz de filtrar as ideias que ele deseja ver por temas, incluindo,
mas não limitado a, o tema da semana. O idioma das ideias também é um filtro possível para as
ideias a serem visualizadas.
Na tela principal do aplicativo, também deve ser possível escolher uma opção para visualizar
as aparências novas a serem compradas, mostrando uma prévia, descrição, preço e nome da
aparência.
Nem toda pessoa pode se registrar como administrador no sistema. Estes são registrados
diretamente por outra plataforma. Um administrador possui as opções, em sua tela principal, de
procurar por usuários, procurar por ideias, bloquear ideias, banir usuários e notificar usuários.
Página 6 / 23
2
– MODELAGEM CONCEITUAL COM DIAGRAMA ENTIDADE-RELACIONAMENTO
Página 7 / 23
3 – MODELAGEM LÓGICA RELACIONAL
3.1 – Relações e Atributos
3.1.1 – Relações, Atributos e Chaves Obtidas Através do Diagrama E-R
● Usuario (EMail, Senha, Nome, Reputacao, DataRegistro)
● Ideia (Id, Descricao, SiglaIdioma, CriadorEMail, DataCriacao, PrivadoUsuario, PrivadoGrupo,
Associado)
○ SiglaIdioma referencia Idioma
○ CriadorEMail referencia Usuario
○ PrivadoUsuario referencia Usuario
○ PrivadoGrupo referencia Grupo
○ Associado referencia Grupo
● Tema (Nome)
● Semana (Numero, DataInicio, DataFim, TemaSemana)
○ TemaSemana referencia Tema
● Vota (IdIdeia, UsuarioEmail, Data, Tipo)
○ UsuarioEmail referencia Usuario
○ IdIdeia referencia Ideia
● Grupo (Nome, Descricao, Criador)
○ Criador referencia Usuario
● Aparencia (Nome, Preco, Descricao)
● Administrador (EMail, Senha, Nome)
● Idioma (Sigla, Nome)
● Pertence (Tema, IdIdeia)
○ Tema referencia Tema
○ IdIdeia referencia Ideia
● Denuncia (IdIdeia, UsuarioEMail, Descricao, Data, Categoria)
○ IdIdeia referencia Ideia
○ UsuarioEMail referencia Usuario
● Compreende (UsuarioEMail, IdiomaSigla)
○ UsuarioEMail referencia Usuario
○ IdiomaSigla referencia Idioma
Página 8 / 23
● Bloqueia (IdIdeia, AdmEMail, Data)
○ IdIdeia referencia Ideia
○ AdmEMail referencia Administrador
● Compra (UsuarioEMail, NomeAparencia, Data)
○ UsuarioEMail referencia Usuario
○ NomeAparencia referencia Aparencia
● Bane (UsuarioEMail, AdminEMail, DataInicio, Duracao)
○ UsuarioEMail referencia Usuario
○ AdminEMail referencia Administrador
● Notifica (UsuarioEMail, AdminEMail, Titulo, Descricao, Data)
○ UsuarioEMail referencia Usuario
○ AdminEMail referencia Administrador
● Visualiza (IdIdeia, UsuarioEMail, Data)
○ IdIdeia referencia Ideia
○ UsuarioEMail referencia Usuario
● Organiza (UsuarioEMail, GrupoNome)
○ UsuarioEMail referencia Usuario
○ GrupoNome referencia Grupo
● Participa (UsuarioEMail, GrupoNome, Data, AdicionadoPor)
○ UsuarioEMail referencia Usuario
○ GrupoNome referencia Grupo
○ AdicionadoPor referencia Usuario
Página 9 / 23
3.1.2 – Processo de Transformação do Diagrama E-R para a Modelagem Lógica Relacional
O primeiro passo para transformar o Diagrama E-R nas relações do Modelo Lógico Relacional
é transformar todas as entidades existentes no diagrama em relações. Cada atributo da Diagrama ER se torna um atributo da relação no Modelo Lógico Relacional, enquanto que atributos
identificadores se transformam em candidatos a chaves primárias para essas entidades. No caso,
foram escolhidos como chaves primárias os mesmos atributos identificadores do Diagrama E-R.
Seguindo este passo, temos que as entidades abaixo gerarão as seguintes relações:
1.
Administrador
1. Administrador (EMail, Senha, Nome)
2.
Aparência
2. Aparencia (Nome, Preco, Descricao)
3.
Grupo
3. Grupo (Nome, Descricao)
4.
Ideia
4. Ideia (Id, Descricao)
5.
Idioma
6.
Participa
6. Participa (UsuarioEMail, GrupoNome, Data)
7.
Semana
o UsuarioEMail referencia Usuario
8.
Tema
o GrupoNome referencia Grupo
9.
Usuário
GERA
5. Idioma (Sigla, Nome)
7. Semana (Numero, DataInicio, DataFim)
8. Tema (Nome)
9. Usuario (EMail, Senha, Nome, Reputacao,
DataRegistro)
O segundo passo é transformar todos os relacionamentos do tipo muitos para muitos no
Diagrama E-R em relações novas no Modelo Lógico Relacional. As chaves primárias escolhidas para
essas relações serão as chaves primárias escolhidas paras as relações geradas pelas entidades que
o relacionamento conecta. Além disso, essas chaves primárias também serão chaves estrangeiras
que referenciam suas tabelas originais. Assim, temos a adição das seguintes novas relações:
1. Bane
2. Compra
1. Bane (UsuarioEMail, AdminEMail, DataInicio,
Duracao)
3. Compreende
o UsuarioEMail referencia Usuario
4. Denuncia
o AdminEMail referencia Administrador
5. Notifica
2. Compra (UsuarioEMail, NomeAparencia, Data)
Página 10 / 23
6. Organiza
o UsuarioEMail referencia Usuario
7. Pertence
o NomeAparencia referencia Aparencia
3. Compreende (UsuarioEMail, IdiomaSigla)
8. Visualiza
o UsuarioEMail referencia Usuario
9. Vota
o IdiomaSigla referencia Idioma
4. Denuncia (IdIdeia, UsuarioEMail, Descricao, Data,
GERA
Categoria)
o IdIdeia referencia Ideia
o UsuarioEMail referencia Usuario
5. Notifica (UsuarioEMail, AdminEMail, Titulo, Descricao,
Data)
o UsuarioEMail referencia Usuario
o AdminEMail referencia Administrador
6. Organiza (UsuarioEMail, GrupoNome)
o UsuarioEMail referencia Usuario
o GrupoNome referencia Grupo
7. Pertence (Tema, IdIdeia)
o Tema referencia Tema
o IdIdeia referencia Ideia
8. Visualiza (IdIdeia, UsuarioEMail, Data)
o IdIdeia referencia Ideia
o UsuarioEMail referencia Usuario
9. Vota (IdIdeia, UsuarioEmail, Data, Tipo)
o UsuarioEmail referencia Usuario
o IdIdeia referencia Ideia
O terceiro passo é transformar os relacionamentos de um para muitos do Diagrama E-R em
atributos das relações já existentes (isto é, unir as supostas relações novas que criaríamos com as
tabelas já relações). No entanto, apenas um relacionamentos foi escolhido para possuir tabela
própria: o relacionamento ‘Bloqueia’ (que relaciona Administrador e Ideia). Esse relacionamento foi
escolhido para ter uma tabela própria pois proporcionalmente, a quantidade de ideias que serão
bloqueadas por administradores é muito pequena frente ao total de ideias existentes. Assim, é mais
Página 11 / 23
prático guardar em uma tabela separada a informação das ideias bloqueadas ao invés de ter várias
tuplas da relação Ideia com um atribulo nulo. Temos então, a seguinte nova tabela:
● Bloqueia (IdIdeia, AdmEMail, Data)
○ IdIdeia referencia Ideia
○ AdmEMail referencia Administrador
Além disso, temos as seguintes alterações das tabelas já existentes, devido à adição de
novos atributos nas relações:
● Ideia (Id, Descricao, SiglaIdioma, CriadorEMail, DataCriacao, PrivadoUsuario, PrivadoGrupo,
Associado)
○ SiglaIdioma referencia Idioma
○ CriadorEMail referencia Usuario
○ PrivadoUsuario referencia Usuario
○ PrivadoGrupo referencia Grupo
○ Associado referencia Grupo
● Semana (Numero, DataInicio, DataFim, TemaSemana)
○ TemaSemana referencia Tema
● Grupo (Nome, Descricao, Criador)
○ Criador referencia Usuario
● Participa (UsuarioEMail, GrupoNome, Data, AdicionadoPor)
○ UsuarioEMail referencia Usuario
○ GrupoNome referencia Grupo
○ AdicionadoPor referencia Usuario
3.2 – Restrições de Integridade
3.2.1 – Restrições de Integridade de Chave
As restrições de integridade de chave estão descritas no item 3.1.1.
Chaves primárias (sublinhadas) devem identificar unicamente cada tupla.
Página 12 / 23
3.2.2 – Restrições de Integridade Referencial
As restrições de integridade referencial estão descritas no item 3.1.1.
Chaves estrangeiras (em itálico) devem possuir valor igual à chave primária de alguma tupla
existente na relação em que elas se referenciam.
3.2.3 – Restrições de Integridade de Entidade
Os atributos abaixo, por serem chaves primárias, não podem ser nulos:

Usuario.EMail

Ideia.Id

Tema.Nome

Semana.Numero

Vota.IdIdeia e Vota.UsuarioEmail

Grupo.Nome

Aparencia.Nome

Administrador.Nome

Idioma.Sigla

Pertence.Tema e Pertence.IdIdeia

Denuncia.IdIdeia e Denuncia.UsuarioEMail

Compreende.UsuarioEMail e Compreende.IdiomaSigla

Bloqueia.IdIdeia e Bloqueia.AdmEMail

Compra.UsuarioEMail e Compra.NomeAparencia

Bane.UsuarioEMail e Bane.AdminEMail

Notifica.UsuarioEMail e Notifica.AdminEMail

Visualiza.IdIdeia e Visualiza.UsuarioEMail

Organiza.UsuarioEMail e Organiza.GrupoNome

Participa.UsuarioEMail e Participa.GrupoNome
Página 13 / 23
3.2.4 – Restrições de Integridade de Domínio

Usuario

EMail: sequências de caracteres alfanuméricos de até 30 caracteres.

Senha: sequências de caracteres alfanuméricos de até 30 caracteres e de, no mínimo,
8 caracteres.

Nome: sequências de caracteres alfanuméricos de até 30 caracteres.

Reputacao: inteiro positivo maior ou igual a zero e menor ou igual a 10.

DataRegistro: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa
= ano válido).

Ideia

Id: numerais de até 8 dígitos.

Descricao: texto com, no máximo, 150 caracteres alfanuméricos.

CriadorEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

DataCriacao: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa
= ano válido).


PrivadoUsuario: sequências de caracteres alfanuméricos de até 30 caracteres.

PrivadoGrupo: sequências de caracteres alfanuméricos de até 30 caracteres.

Associado: sequências de caracteres alfanuméricos de até 30 caracteres.
Tema


Nome: sequências de caracteres de até 30 caracteres.
Semana

Numero: numerais de até 3 dígitos.

DataInicio: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa =
ano válido).

DataFim: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa =
ano válido).


Tema semana: sequências de caracteres alfanuméricos de até 30 caracteres.
Vota

IdIdeia: numerais de até 8 dígitos.

UsuarioEmail: sequências de caracteres de até 30 caracteres.

Data: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa = ano
válido).
Página 14 / 23




Tipo: sequências de caracteres alfanuméricos de até 30 caracteres.
Grupo

Nome: sequências de caracteres de até 30 caracteres.

Descricao: texto com, no máximo, 150 caracteres alfanuméricos.

Criador: sequências de caracteres alfanuméricos de até 30 caracteres.
Aparencia

Nome: sequências de caracteres alfanuméricos de até 30 caracteres.

Preco: números reais maiores que 1.

Descricao: texto com, no máximo, 150 caracteres alfanuméricos
Administrador

EMail: sequências de caracteres de até 30 caracteres.

Senha: sequências de caracteres alfanuméricos de até 30 caracteres e de, no mínimo,
8 caracteres.




Nome: sequências de caracteres alfanuméricos de até 30 caracteres.
Idioma

Sigla: sequência de 3 caracteres alfabéticos

Nome: sequências de caracteres alfanuméricos de até 30 caracteres.
Pertence

Tema: sequências de caracteres alfanuméricos de até 30 caracteres.

IdIdeia: numerais de até 8 dígitos.
Denuncia

IdIdeia: numerais de até 8 dígitos.

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

Data: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa = ano
válido).



Categoria: sequências de caracteres alfanuméricos de até 30 caracteres.
Compreende

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

IdiomaSigla: sequências de 3 caracteres alfabéticos.
Bloqueia

IdIdeia: numerais de até 8 dígitos.

AdmEMail: sequências de caracteres alfanuméricos de até 30 caracteres.
Página 15 / 23

Data: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa = ano
válido).

Compra

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

NomeAparencia: sequências de caracteres alfanuméricos de até 30 caracteres.

Data: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa = ano
válido).

Bane

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

AdminEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

DataInicio: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa =
ano válido).

Notifica

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

AdminEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

Titulo: sequências de caracteres alfanuméricos de até 30 caracteres.

Descricao: texto com, no máximo, 150 caracteres alfanuméricos.

Data: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa = ano
válido).

Visualiza

IdIdeia: numerais de até 8 dígitos.

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

Data: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa = ano
válido).


Organiza

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

GrupoNome: sequências de caracteres alfanuméricos de até 30 caracteres.
Participa

UsuarioEMail: sequências de caracteres alfanuméricos de até 30 caracteres.

GrupoNome: sequências de caracteres alfanuméricos de até 30 caracteres.

Data: data válida (dd-mm-aaaa), onde (dd = dia válido, mm = mês válido, aaaa = ano
válido).

AdicionadoPor: sequências de caracteres alfanuméricos de até 30 caracteres.
Página 16 / 23
3.2.5 – Algumas Restrições de Integridade Semântica

O e-mail de identificação de cada Usuário, assim como de cada Administrador, deve ser um email válido.

Se um usuário criou um grupo e participa deste, consta naquele grupo como adicionado por
nulo.

Uma ideia ou é privada para um grupo ou é privada para um usuário, nunca ambos.

O preço de uma aparência deve ser maior ou igual a R$ 1,00.

A data de início de uma semana não pode ser maior que a data de fim da mesma semana.
Página 17 / 23
4 – EXEMPLOS DE CONSULTAS EM ÁLGEBRA RELACIONAL
1. Quantos votos do tipo X uma ideia de id Y possui?
𝑔𝑐𝑜𝑢𝑛𝑡(𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑀𝑎𝑖𝑙) (𝜎𝑇𝑖𝑝𝑜 = 𝑋,𝐼𝑑𝐼𝑑𝑒𝑖𝑎 = 𝑌 (𝑉𝑜𝑡𝑎))
2. Qual o id das ideias ainda não lidas por um usuário de e-mail E que seja de algum idioma
compreendido por ele?
𝐼𝑑𝑒𝑖𝑎𝑠𝐽𝑎𝑉𝑖𝑠𝑢𝑎𝑙𝑖𝑧𝑎𝑑𝑎𝑠 ← 𝜋𝐼𝑑𝐼𝑑𝑒𝑖𝑎 (𝜎𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑚𝑎𝑖𝑙 = 𝐸 (𝑉𝑖𝑠𝑢𝑎𝑙𝑖𝑧𝑎))
𝐼𝑑𝑒𝑖𝑎𝑠𝑁𝑎𝑜𝑉𝑖𝑠𝑢𝑎𝑙𝑖𝑧𝑎𝑑𝑎𝑠 ← (𝜋𝐼𝑑𝐼𝑑𝑒𝑖𝑎 (𝐼𝑑𝑒𝑖𝑎)) \ (𝐼𝑑𝑒𝑖𝑎𝑠𝐽𝑎𝑉𝑖𝑠𝑢𝑎𝑙𝑖𝑧𝑎𝑑𝑎𝑠)
𝐼𝑑𝑒𝑖𝑎𝐼𝑑𝑖𝑜𝑚𝑎 ← 𝜋𝐼𝑑𝐼𝑑𝑒𝑖𝑎 ((𝜎𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑀𝑎𝑖𝑙 = 𝐸 (𝐶𝑜𝑚𝑝𝑟𝑒𝑒𝑛𝑑𝑒)) ⨝𝑆𝑖𝑔𝑙𝑎𝐼𝑑𝑖𝑜𝑚𝑎 = 𝐼𝑑𝑖𝑜𝑚𝑎𝑆𝑖𝑔𝑙𝑎 (𝐼𝑑𝑖𝑜𝑚𝑎 ) )
𝑅𝑒𝑠𝑝𝑜𝑠𝑡𝑎 ← (𝐼𝑑𝑒𝑖𝑎𝑠𝑁𝑎𝑜𝑉𝑖𝑠𝑢𝑎𝑙𝑖𝑧𝑎𝑑𝑎𝑠) ∩ (𝐼𝑑𝑒𝑖𝑎𝐼𝑑𝑖𝑜𝑚𝑎)
3. Quais são os nomes dos temas que nunca foram temas da semana?*
𝜋𝑁𝑜𝑚𝑒 (𝜎𝑇𝑒𝑚𝑎𝑆𝑒𝑚𝑎𝑛𝑎 = 𝑁𝑈𝐿𝐿 ((𝑇𝑒𝑚𝑎) ]⨝ 𝑁𝑜𝑚𝑒 = 𝑇𝑒𝑚𝑎𝑆𝑒𝑚𝑎𝑛𝑎 (𝑆𝑒𝑚𝑎𝑛𝑎 )))
(*Observação: Notação para OuterJoin a Esquerda: "]⨝")
4. Quais são os ids das ideias que possuem todos os mesmos temas que a ideia de id X?
(𝑃𝑒𝑟𝑡𝑒𝑛𝑐𝑒) ÷ (𝜋𝑇𝑒𝑚𝑎 (𝜎𝐼𝑑𝐼𝑑𝑒𝑖𝑎 = 𝑋 (𝑃𝑒𝑟𝑡𝑒𝑛𝑐𝑒)))
5. Quais são os ids das ideias criadas pelo usuário de e-mail E?
𝜋𝐼𝑑 ( 𝜎𝐶𝑟𝑖𝑎𝑑𝑜𝑟𝐸𝑚𝑎𝑖𝑙=𝐸 (𝐼𝑑𝑒𝑖𝑎))
6. Quais os e-mails dos usuários com duração de banimento maior do que X feitos pelo
administrador de e-mail Z?
𝜋𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑀𝑎𝑖𝑙 (𝜎𝐷𝑢𝑟𝑎𝑐𝑎𝑜>𝑋 (𝜎𝐴𝑑𝑚𝑖𝑛𝐸𝑀𝑎𝑖𝑙=𝑍 (𝐵𝑎𝑛𝑒)))
7. Quais os e-mails de todos os usuários que pertencem ao grupo associado a ideia de id X?
𝜋𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑀𝑎𝑖𝑙 ((𝜎𝐼𝑑=𝑋 (𝐼𝑑𝑒𝑖𝑎)) ⨝𝑃𝑟𝑖𝑣𝑎𝑑𝑜𝐺𝑟𝑢𝑝𝑜=𝐺𝑟𝑢𝑝𝑜𝑁𝑜𝑚𝑒 𝑃𝑎𝑟𝑡𝑖𝑐𝑖𝑝𝑎)
Página 18 / 23
8. Quais os ids e descrições das ideias privadas do grupo de nome X?
𝜋𝐼𝑑,𝐷𝑒𝑠𝑐𝑟𝑖𝑐𝑎𝑜 (𝜎𝑃𝑟𝑖𝑣𝑎𝑑𝑜𝐺𝑟𝑢𝑝𝑜=𝑋 (𝐼𝑑𝑒𝑖𝑎))
9. Quais os e-mails dos usuários que compraram a aparência de nome X?
𝜋𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑀𝑎𝑖𝑙 (𝜎𝑁𝑜𝑚𝑒𝐴𝑝𝑎𝑟𝑒𝑛𝑐𝑖𝑎=𝑋 (𝐶𝑜𝑚𝑝𝑟𝑎))
10. Quais os nomes dos grupos que compartilharam alguma ideia com o público?
𝜋𝑁𝑜𝑚𝑒 (𝐺𝑟𝑢𝑝𝑜 ⨝𝑁𝑜𝑚𝑒=𝑃𝑟𝑖𝑣𝑎𝑑𝑜𝐺𝑟𝑢𝑝𝑜 𝐼𝑑𝑒𝑖𝑎) \ 𝜋𝑃𝑟𝑖𝑣𝑎𝑑𝑜𝐺𝑟𝑢𝑝𝑜 (𝜎𝐴𝑠𝑠𝑜𝑐𝑖𝑎𝑑𝑜=𝑁𝑈𝐿𝐿 (𝐼𝑑𝑒𝑖𝑎))
11. Qual o preço médio das aparências disponíveis?
𝑔𝑎𝑣𝑔(𝑃𝑟𝑒𝑐𝑜) (Aparencia)
12. Quais os e-mails dos usuários que não compraram nenhuma aparência?
𝜋𝐸𝑀𝑎𝑖𝑙 (𝑈𝑠𝑢𝑎𝑟𝑖𝑜) \ 𝜋𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑀𝑎𝑖𝑙 (𝐶𝑜𝑚𝑝𝑟𝑎)
13. Quais os e-mails dos administradores que baniram usuários por mais tempo que todos os
outros na data X?
𝜋𝐴𝑑𝑚𝑖𝑛𝐸𝑚𝑎𝑖𝑙 (𝑔𝑚𝑎𝑥(𝐷𝑢𝑟𝑎𝑐𝑎𝑜) (Bane) ⨝𝐷𝑢𝑟𝑎𝑐𝑎𝑜 = 𝐷𝑢𝑟𝑎𝑐𝑎𝑜2 𝛿𝐷𝑢𝑟𝑎𝑐𝑎𝑜→𝐷𝑢𝑟𝑎𝑐𝑎𝑜2 (𝐵𝑎𝑛𝑒 ))
14. Quantas ideias não-privadas o usuário de e-mail X criou?
𝑔𝑐𝑜𝑢𝑛𝑡(𝐼𝑑) (𝜎𝑃𝑟𝑖𝑣𝑎𝑑𝑜𝐺𝑟𝑢𝑝𝑜=𝑁𝑈𝐿𝐿,𝑃𝑟𝑖𝑣𝑎𝑑𝑜𝑈𝑠𝑢𝑎𝑟𝑖𝑜=𝑁𝑈𝐿𝐿,𝐶𝑟𝑖𝑎𝑑𝑜𝑟𝐸𝑚𝑎𝑖𝑙=𝑋 (𝐼𝑑𝑒𝑖𝑎))
15. Quais os nomes dos grupos organizados ou criados pelo usuário de e-mail E?
𝜋𝐺𝑟𝑢𝑝𝑜𝑁𝑜𝑚𝑒 (𝜎𝑈𝑠𝑢𝑎𝑟𝑖𝑜𝐸𝑀𝑎𝑖𝑙=𝐸 (𝑂𝑟𝑔𝑎𝑛𝑖𝑧𝑎)) ∪ 𝛿𝑁𝑜𝑚𝑒→𝐺𝑟𝑢𝑝𝑜𝑁𝑜𝑚𝑒 (𝜋𝑁𝑜𝑚𝑒 (𝜎𝐶𝑟𝑖𝑎𝑑𝑜𝑟=𝐸 (𝐺𝑟𝑢𝑝𝑜)))
Página 19 / 23
5 – CONSULTAS EM SQL.
1. Quantos votos do tipo X uma ideia de id Y possui?
SELECT count(*)
FROM Vota
WHERE IdIdeia = X
AND Tipo = 'Y'
2. Qual o id das ideias ainda não lidas por um usuário de e-mail E que seja de algum idioma
compreendido por ele, e não são privadas a nenhum grupo nem usuário?
SELECT IdIdeia
FROM Ideia
WHERE IdIdeia NOT IN (
SELECT IdIdeia
FROM Visualiza
WHERE UsuarioEMail = 'E')
AND SiglaIdioma IN (
SELECT SiglaIdioma
FROM Compreende
WHERE UsuarioEMail = 'E')
AND PrivadoUsuario IS null
AND PrivadoGrupo IS null
3. Quais são os nomes dos temas que nunca foram temas da semana?
SELECT DISTINCT Nome
FROM Tema
WHERE Nome NOT IN (
SELECT TemaDaSemana
FROM Semana)
Página 20 / 23
4. Quais são os ids das ideias que possuem todos os mesmos temas que a ideia de id X?
SELECT IdIdeia
FROM Pertence
WHERE Tema = all (
SELECT Tema
FROM Pertence
WHERE IdIdeia = X)
5. Quais são os ids das ideias criadas pelo usuário de e-mail E?
SELECT IdIdeia
FROM Ideia
WHERE UsuarioEMail = 'E'
6. Quais os e-mails dos usuários com duração de banimento maior do que X feitos pelo
administrador de e-mail Z?
SELECT UsuarioEMail
FROM Bane
WHERE Duracao > X
AND AdminEMail = 'Z'
7. Quais os e-mails de todos os usuários que pertencem ao grupo associado a ideia de id X?
SELECT UsuarioEMail, Id
FROM Participa, Ideia
WHERE Participa.GrupoNome = Ideia.PrivadoGrupo
8. Quais os ids e descrições das ideias privadas do grupo de nome X?
SELECT Id, Descricao
FROM Ideia
WHERE PrivadoGrupo = 'X'
Página 21 / 23
9. Quais os e-mails dos usuários que compraram a aparência de nome X?
SELECT UsuarioEMail
FROM Compra
WHERE NomeAparencia = 'X'
10. Quais os nomes dos grupos que compartilharam alguma ideia com o público?
SELECT Associado
FROM Ideia
WHERE Associado IS NOT null
11. Qual o preço médio das aparências disponíveis?
SELECT avg(preco)
FROM Aparencia
12. Quais os e-mails dos usuários que não compraram nenhuma aparência?
SELECT EMail
FROM Usuario /
WHERE Email NOT IN (Select EMailUsuario From Compra)
13. Quais os e-mails dos administradores que baniram usuários por mais tempo que todos os
outros na data X?
SELECT AdminEmail
FROM Bane
WHERE Duracao > all (
SELECT Duracao
FROM Bane
WHERE DataInicio = 'X')
14. Quantas ideias o usuário de e-mail X criou?
SELECT count(*)
FROM Ideia
WHERE CriadorEMail = 'X'
Página 22 / 23
15. Quais os nomes dos grupos organizados ou criados pelo usuário de e-mail E?
(SELECT GrupoNome
FROM Organiza
WHERE UsuarioEMail = 'E')
UNION
(SELECT Nome
FROM Grupo
WHERE Criador = 'E')
Página 23 / 23
Download

WeMagine - PUC-Rio