hades icon indicating copy to clipboard operation
hades copied to clipboard

Definir o schema do banco de dados

Open cristiano-pacheco opened this issue 7 years ago • 69 comments

Definir qual banco de dados iremos utilizar (Mysql, Postgres, etc..)

Definir as tabelas e relacionamentos.

cristiano-pacheco avatar Oct 19 '17 20:10 cristiano-pacheco

Segue a modelagem que eu montei.

O que vocês acham?

db

cristiano-pacheco avatar Oct 20 '17 12:10 cristiano-pacheco

Posso ter entendido mal, mas ficou uns pontos em aberto pra mim:

  • mentoring_skills faltou a ligação com mentoring
  • request faltou uma ligacao com as skills e area que estão sendo requisitadas
  • o que seria o level no request, parece que deveria ter um level por skill e não por request, por que o level da pessoa já esta no person
  • user não deveria ser um person tb?

hdamaich avatar Oct 20 '17 14:10 hdamaich

@hdamaich obrigado pela revisão.

mentoring_skills faltou a ligação com mentoring resolvido, eu não tinha criado a chave primaria para a tabela mentoring.

request faltou uma ligação com as skills e area que estão sendo requisitadas Bem observado, fiz a correção.

o que seria o level no request, parece que deveria ter um level por skill e não por request, por que o level da pessoa já esta no person coloquei este campo baseado na issue que o @bernardodiasc abriu (https://github.com/training-center/R2D2/issues/40) mas olhando novamente eu acredito que também não há necessidade.

user não deveria ser um person tb? isso eu estou com dúvida, nos requisitos está descrito que o email do usuário pode ser diferente do cadastrado na plataforma via login social,

mas não vejo problema em deixar na tabela person, quando o login é feito via rede social, é armazenado algo no banco?

segue o DER com as alterações: der

cristiano-pacheco avatar Oct 21 '17 01:10 cristiano-pacheco

user não deveria ser um person tb? isso eu estou com dúvida, nos requisitos está descrito que o email do usuário pode ser diferente do cadastrado na plataforma via login social,

Certo, acho que sim, mas no person podemos deixar o email como email de login, e nos contatos podemos ter um email de contato.

Outros pontos de revisão:

  • person_contacts ta meio estranho parece, contacts seria o tipo de contato correto? Onde exatamente vai o contato em si? Para mim contacts deveria ter os tipos de contato (email, github, linkedin...) e person_contacts ter mais um campo para o contato em si.

Uma duvida:

  • O que é especialização de um mentor?

hdamaich avatar Oct 21 '17 02:10 hdamaich

Certo, acho que sim, mas no person podemos deixar o email como email de login, e nos contatos podemos ter um email de contato.

Boa Ideia! só vou adicionar os campos de senha e status na tabela person. status será para controlar os usuários inativos, por exemplo.

O que é especialização de um mentor?

front end, back end, mobile, full stack

cristiano-pacheco avatar Oct 21 '17 02:10 cristiano-pacheco

front end, back end, mobile, full stack

Mas o que seria o area entao?

hdamaich avatar Oct 21 '17 02:10 hdamaich

Pelo que estou vendo, é a mesma coisa! rs não sei o que o @woliveiras pensou quando escreveu os requisitos, talvez esteja duplicado mesmo.

da uma olhada no documento https://github.com/training-center/hades/blob/master/requisitos_plataforma.md

cristiano-pacheco avatar Oct 21 '17 03:10 cristiano-pacheco

Eu acho que área seria front end, back end, mobile, full stack. Especialização seria Ruby, Python, Swift, Android, etc...

juniorodilton avatar Oct 21 '17 10:10 juniorodilton

@cristianopacheco @odilton

Bom para mim area deveria ser (vou fazer um PR para corrigir isso na definição)

  • front end, back end, mobile, full stack

skill deveria ser:

  • Ruby, Python, Swift, Android, etc...

E especialidade está sobrando, tem mais alguma coisa que perdi?

hdamaich avatar Oct 21 '17 17:10 hdamaich

Verdade @hdamaich, deixei passar a skill. Acho que vale essa correção que você colocou!

juniorodilton avatar Oct 22 '17 01:10 juniorodilton

Eaee Pessoal, então o BD vai ser Postgres, alguém tem outra opinião quanto a isso?

Alguns pontos, quanto as infos de login, onde elas estariam? Eu nunca mexi com login social, mas n deveriamos guardar algo?

Outra questão, será que não podemos desnormalizar um pouco isso? Ex: A parte de person_contact apenas uma forma de contato que nós utilizamos, que é o email. Acho que isso serve para outras coisas tbm. Obs: Podemos ter um campos das redes sociais, mas não usamos ela como contato.

@bernardodiasc junte-se a nós.

Galera, fora isso o que faltamos para fechar isso? A ideia é fazer um Dojo no sábado, e seria legal já ter a base de dados.

lflimeira avatar Oct 22 '17 19:10 lflimeira

@lflimeira A relação com person_contact é 1 pra N pelo que entendi, logo uma pessoa pode ter vários contatos. Cada tipo de contato vai pra contatcs pelo que entendi, como github, facebook, twitter etc...

Sobre o tipo de login podemos abrir uma issue só pra isso, a estrutura que temos aqui acho que não se adapta mesmo.

hdamaich avatar Oct 22 '17 22:10 hdamaich

Então, mas não seria melhor deixar isso fixo? Redes sociais não é uma coisa que muda com frequência saca? Mas assim tbm funciona, então n vejo como impeditivo rsrsrs

Pois é, precisamos alinhar isso do login social o quanto antes, para dar continuidade com o projeto.

Minha sugestão é que assim que fechar a modelagem do BD poderia criar uma imagem docker do BD, o que acha @hdamaich ?

lflimeira avatar Oct 22 '17 23:10 lflimeira

@cristianopacheco Eu não entendi bem a função da contacts. Eu tenho campo name ali, mas onde vai o valor em si? Por exemplo, eu tenho uma person que tem facebook e twitter. Onde vão esses dados? Se eles vão na tabela contacts, como eu consigo diferenciar twitter de facebook? @lflimeira e @hdamaich Normalmente em casos de login social nós guardamos o access_token e o refresh_token (Onde a grande maioria dos cenários são de OAuth2), mas eu nunca tive que trabalhar com multiplos logins sociais de uma vez, talvez uma solução seja gerar um JWT para o usuário... OU delegar isso para um provedor, tal como o auth0.

angeliski avatar Oct 23 '17 00:10 angeliski

@lflimeira Isso, amanha pretendo montar uma estrutura com Docker pra nossa aplicação, com banco + aplicação, para todo mundo conseguir usar em sua casa sem se preocupar com instalações.

@lflimeira @angeliski Vamos criar uma issue para discutirmos apenas a estratégia de login, o que acham? Mas adianto que OAuth2 parece ser o que precisamos. #6

@angeliski Sobre o contats, ainda falta algumas modificações nos campos da tabela como comentei mais acima, pelo que entendi funcionará assim.

  • contacts será um índice para os possíveis tipo de contatos que podemos ter, EX: github, facebook...
  • person_contacts terá os contatos de cada pessoa, linkando para o tipo de contato e para pessoa (ainda falta um campo para armazenar o contato em si, @cristianopacheco)

@lflimeira Acho ruim fixar a quantidade de contatos, pois algum dia pode surgir coisas novas que façam sentido termos o link, tipo perfil em alguma plataforma de RH (coisa do tipo)...

hdamaich avatar Oct 23 '17 02:10 hdamaich

Entendi @hdamaich, nesse caso a tabela contacts seria mais como se fosse o tipo(github, facebook, linkedin), certo? Nesse ponto eu concordo um pouco com o @lflimeira em relação a desnormalização, um enum direto na person_contacts não seria mais eficiente? Nesse caso eu teria mais um join só pra saber que é um Github da vida

angeliski avatar Oct 23 '17 09:10 angeliski

@hdamaich @lflimeira @angeliski

Segue a modelagem com as correções.

Sobre a autenticação, podemos deixar desta forma por enquanto e seguir, por que já resolve primeira forma de autenticação mais simples baseado em usuário e senha. Quando for implementado o login via rede social, agente cria os campos/tabelas necessárias para esta funcionalidade.

Sobre os contatos, eu prefiro deixar separado por que fica mais genérico e atende a mais situações e evita deixar campos sem valor na tabela.

Se vocês concordarem com esta modelagem, eu vou gerar o db para o postgres e anexar no projeto.

O próximo passo seria criar uma issue para mapear estas tabelas no ORM (Sequelize).

Como vamos resolver a questão dos dados default, vamos criar migrations ou vai existir um banco já com estes dados no projeto?

ex: de dados default -> areas, skills, contacts, permissions, levels.

modelagem

cristiano-pacheco avatar Oct 23 '17 10:10 cristiano-pacheco

Show @cristianopacheco ! Com relação aos dados, aqui na empresa nós usamos uma database manager chamada Bee, é uma solução open que criamos para nos atender. Nele tem o conceito de dbseed, que são esquemas de semente e de dados core, que são tabelas que tem dados "inalteráveis" pela aplicação. Tem o Flyway, mas esse eu usei uma vez só a muuito tempo.

angeliski avatar Oct 23 '17 11:10 angeliski

Sobre abordagem dos dados, como vamos usar uma imagem docker, tanto faz a abordagem, ambas vai ser "click to play".

Migration serve pra documentar o DB tambem, mas pelo que eu vi no Sequelize as migrations ficam meio zoadas (impressao que tive). Voces tem experiencia em usar Migration do Sequelize?

hdamaich avatar Oct 23 '17 12:10 hdamaich

Legal @angeliski, vou dar uma olhada no Bee. Flyway já usei com Java é bem bacana mesmo.

@hdamaich, eu penso em usar as migrations mais para os dados, por que se mapear entidades 100% com o Sequelize, ele ja cria os metadados de forma automática.

ou

Posso gerar o banco de dados com a estrutura inicial (Tabelas e dados) colocar o backup no projeto, e rodar um comando com o docker para restaurar o backup ou algo deste tipo.

O que vocês acham?

cristiano-pacheco avatar Oct 23 '17 17:10 cristiano-pacheco

Nao estou 100% certo disso, mas se vamos manter uma estrutura consolidada, entao mantemos com dados base tambem. Voces veem alguma vantagem em outra abordagem?

hdamaich avatar Oct 23 '17 17:10 hdamaich

Olha eu aqui renovo povo kkkkk então eu sou a favor de migrations, se o do sequelize é zuado, bora usar mongoose. E eu acho que a tabela está show agora.

lflimeira avatar Oct 23 '17 17:10 lflimeira

Eu sou a favor de migrations porque acho que a base tem que ser "reproduzivel" a qualquer momento, acho ruim criar uma dependencia com o Docker, mas isso já é uma opnião, não sei dizer a vantagem e desvatagem da abordagem em si.

angeliski avatar Oct 23 '17 17:10 angeliski

@hdamaich @lflimeira @angeliski

vamos criar as migrations então! rs

bom, saímos do zero! definimos a estrutura inicial das tabelas agora é so começar a implementar.

acredito que esta issue esta concluída, certo?

cristiano-pacheco avatar Oct 23 '17 18:10 cristiano-pacheco

Vamos considerar concluída quando o docker estiver na master pode ser?

Assim que subir o docker eu já mando bala no endpoint de cadastro, e preparo tudo para o nosso Dojo.

lflimeira avatar Oct 23 '17 18:10 lflimeira

Quanto a "dependencia" do docker? Pq vc acha ruim @angeliski?

lflimeira avatar Oct 23 '17 18:10 lflimeira

Acho que eu me expressei mal @lflimeira . Não é que é ruim ter o Docker, ele é uma ferramenta super top e tem que ser usada mesmo. O que eu acho ruim é que sem o docker, não tem como subir uma base. Você não consegue reproduzir o database fora dele (nesse caso), já que todas as modificações e alterações são imagens novas dele. Claro, isso é mais uma questão de opinião mais que uma definição técnica. Se vc tem um schema inicial e uma migração para as alterações, a qualquer momento você consegue criar o schema e subir as alterações tendo uma base igual a de produção.

angeliski avatar Oct 23 '17 19:10 angeliski

@angeliski @lflimeira Vou fazer de uma forma que de para rodar com ou sem docker. Só que quem tiver sem docker vai ter que fazer os passos na mão.

@cristianopacheco @angeliski @lflimeira Vamos usar Sequelize mesmo?

hdamaich avatar Oct 23 '17 20:10 hdamaich

Então com a migration eu acho que já da para subir o ambiente, o que seria bom de forçar o docker é o fato de que todos trampam no mesmo ambiente. Principalmente por ser um código open.

@hdamaich pode mandar bala, então se a migration do mongoose for melhor podemos usar ele. O do sequelize eu realmente n manjo.

lflimeira avatar Oct 23 '17 20:10 lflimeira

@hdamaich Sequelize foi uma ideia, acho interessante agente usar um ORM, mas se vc quiser indicar outro, não vejo problema. Uma outra opção que conheço é o Knex.

@lflimeira, da para usar o mongoose com postgres?

cristiano-pacheco avatar Oct 24 '17 10:10 cristiano-pacheco