Parte 0: Criando um modelo de dados
Antes de criar o Touchbase, é importante definir a estrutura de como os dados serão armazenados. Na forma mais básica, há realmente três coisas diferentes que precisaremos armazenar.
- Documento do usuário: Armazena todas as informações sobre um determinado usuário.
- Postagens: Todas as postagens criadas pelos usuários devem ser armazenadas com as informações necessárias para exibição.
- Imagens: Todas as imagens de perfil de usuário devem ser armazenadas como dados binários (neste caso, base64).
DOCUMENTO DO USUÁRIO
Primeiro, começaremos com o documento do usuário. Esse documento é simplesmente armazenado em um UUID (Universally Unique Identifier, identificador único universal). A razão para isso é que o ID do documento não deve nos dizer nada sobre o usuário; tudo isso deve vir do conteúdo do documento. Por exemplo, digamos que armazenamos cada um dos documentos do usuário usando o endereço de e-mail do usuário como ID do documento. Se um usuário quisesse alterar seu e-mail, isso seria um grande problema, pois seria necessário armazenar o documento atual, armazená-lo novamente com um novo ID de documento e excluir o documento antigo. Ao implementar um UUID, podemos localizar o usuário e alterar o atributo 'email' em seu documento usando uma instrução N1QL UPDATE. Isso explica por que algo independente do conteúdo do documento deve ser usado. Também queremos ter certeza de que nenhum dos IDs de documento será o mesmo, de modo que isso garantirá algoritmicamente que IDs de documento duplicados sejam praticamente impossíveis. Abaixo, você verá o atributo 'uuid', que é usado como ID do documento.
Exemplo de documento do usuário
(observe que alguns campos foram ocultados!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
{ "Nome": "Pranav Mayuram", "arrayAttributes": { "Especialização": [ "Touchbase" ], "Hobbies": [] }, "dropdownAttributes": { "Escritório Base": "Vista da montanha", "Divisão": "Engenharia" }, "login": { "administrador": falso, "email": "????????@couchbase.com", "emailVerified": verdadeiro, "hasPicture": verdadeiro, "tipo": "usuário" }, "senha": "????????????????????????????????????", "picSRC": "", "stringAttributes": { "Título do cargo": "Estagiário N1QL", "Skype": "????????????" }, "timeTracker": { "loginTimes": [ "2015-08-24T20:44:38.133Z", "2015-08-22T21:37:13.294Z" ], "registerTime": "2015-08-22T21:37:13.294Z", "updateTimes": [] }, "uuid": "b48e2033-4c7b-48d9-b45a-3854500e8e61" } |
Esse documento do usuário é vinculado ao restante dos documentos de diferentes maneiras, mas o mais importante é manter todas as informações que o usuário insere no registro. Elas podem ser divididas em três tipos diferentes de informações, que seriam: 'array attributes', 'string attributes'e 'atributos suspensos'. Normalmente, essas são as três maneiras pelas quais um usuário insere informações, e o aplicativo altera a forma como elas são tratadas de acordo. Os atributos podem ser alterados de acordo com o config.json de modo que o usuário seja solicitado a fornecer informações diferentes. Essa pode não ser considerada a abordagem mais intuitiva para um modelo de dados, mas agiliza significativamente o desenvolvimento do aplicativo. O config.json pode ser visto abaixo, mostrando como os dados poderiam ser personalizados por um desenvolvedor (o usuário será solicitado a fornecer informações diferentes), mas ainda assim seriam tratados da mesma forma pelo aplicativo. A personalização desses atributos ocorreria no objeto 'dataModel'.
config.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
{ "couchbase": { "servidor": "127.0.0.1:8091", "userBucket": "usuários", "pictureBucket": "users_pictures", "publishBucket": "users_publishments", "TouchbasePort": 3000 }, "SendGrid": { "nome de usuário" : "", "senha" : "" }, "dataModel": { "projectName": "Touchbase", "colorHex": "#4DD0E1", "primaryAttribute": "Nome", "arrayAttributes" : ["Especialização","Hobbies"], "stringAttributes": ["Título do cargo", "Skype"], "dropdownAttributes": [ { "varname": "Escritório Base", "opções": ["Vista da montanha","São Francisco","Bangalore","Manchester","Outro - Remoto"] }, { "varname": "Divisão", "opções": ["Engenharia","Vendas","Marketing","Suporte","Outra equipe"] } ], "pubTypes": [ { "tipo": "Projetos do Github", "imagePath": "GitHub-Mark-120px-plus.png", "ícone": "github" }, { "tipo": "Couchbase nas notícias", "imagePath": "couchbase-logo.png", "ícone": "jornal" } ] } } |
POST DOCUMENT
Em seguida, teremos que armazenar as postagens. Esses também são documentos JSON simples e manterão as informações de que precisamos sobre cada post. Eles também são armazenados como UUIDs, com '_pub_
Exemplo de documento de postagem
1 2 3 4 5 6 7 8 9 10 11 |
{ "authorID": "b48e2033-4c7b-48d9-b45a-3854500e8e61", "blurb": "Projeto de rede social criado com um back-end flexível que permite personalização total. Projetado usando Couchbase, Node.js, Express no back-end. O front-end foi projetado usando Angular.js, Angular Material Design, bem como partes do Bootstrap, Semantic UI e Materialize CSS. Criado por Pranav Mayuram.", "hyperlink": "https://github.com/couchbaselabs/touchbase", "imagePath": "GitHub-Mark-120px-plus.png", "pubType": "Projetos do Github", "publishID": "06990d4f-d743-43c2-95f5-2d8e27dfcbc5_pub_Github Projects", "tempo": "2015-08-25T03:55:19.468Z", "título": "Touchbase", "tipo": "post" } |
Cada postagem tem três partes principais: título, link e sinopse. Isso contém quase tudo o que é necessário em uma postagem, mas há outras coisas simples que armazenaremos no back-end, que o usuário não inserirá diretamente.
Primeiramente, usaremos o ID do usuário e o armazenaremos com a publicação. Também armazenaremos a hora em que a postagem foi feita. Há também um 'pubType' que é o tipo de publicação que foi feita, e isso é obtido de onde a postagem foi feita no front-end.
Por exemplo, se fizermos a postagem na seção 'Projetos do Github' seção, o 'pubType' que foi armazenado seria 'Projetos do Github'. Haveria também um 'imagePath' associado a esse 'pubType' no config.json que obteria a imagem correspondente para esse documento 'pubType' do ícones pasta.
Por fim, quando estivermos extraindo os documentos de postagem, usaremos uma função para manipular esses documentos e enviá-los para o front-end conforme acharmos adequado. Na implementação atual, uma consulta N1QL é executada para encontrar cada documento que seja do 'pubType' em que a tela do usuário esteja (por exemplo, se o usuário estiver em 'Github Projects', somente os documentos com um 'pubType' de 'Github Project' serão extraídos). Em seguida, os documentos serão ordenados pelo horário em que foram postados, de modo que os mais recentes sejam os primeiros. Você também deve ter notado que armazenamos apenas o 'authorID', e não o nome do autor'. A função que extrai as postagens também fará uma pesquisa do nome de cada autor de acordo com o 'authorID', caso o autor mude de nome na rede. Mais adiante, nesta série do blog, será feita uma análise detalhada do armazenamento e da recuperação de posts.
DOCUMENTO COM IMAGEM
Por fim, teremos que armazenar imagens. Atualmente, isso é feito usando Multeruma parte do middleware do Node.js. Isso também será explicado em mais detalhes posteriormente nesta série do blog. Um recurso importante do armazenamento de imagens é que precisaremos associar essa imagem ao documento do usuário para o mesmo usuário. Atualmente, isso é feito por meio do ID do documento da imagem, em que o ID do documento é armazenado com o mesmo ID do documento do usuário com '_picMulterNode' anexado à ID.
Identificação do documento com foto
1 |
'b48e2033-4c7b-48d9-b45a-3854500e8e61_picMulterNode' |
CONCLUSÃO
Blogs futuros : Esta série de blogs se concentrará no aspecto de back-end desse aplicativo, especialmente porque ele segue os princípios REST. As explicações se concentrarão no código Node.js usando a estrutura Express; no entanto, alguns códigos HTML e Angular.js serão mostrados quando necessário para a implementação da API REST. Para ver o código completo, com o front-end incluído, acesse https://github.com/couchbaselabs/touchbase. Para o front-end, isso faz uso de Angular.js, HTML5, Angular UI Router, Angular Material Design e muito mais. Todo o código do Angular.js pode ser visto em TouchbaseModular/public/js. HTML pode ser visto em TouchbaseModular/público dentro de index.html (usa signUp.js) e nav.html (usa touchbase.js). Todas as partições HTML do Angular UI Router podem ser vistas em TouchbaseModular/public/html. Uma documentação de projeto mais detalhada também pode ser vista no Documentação pasta.
Com isso, concluímos nosso blog sobre modelos de dados e espero que ele tenha sido útil para todos vocês. Se você tiver alguma dúvida, preocupação ou feedback, deixe um comentário abaixo.