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