Home | Escopo e Cronograma | Processo | Design/Mockups | Configuração | Arquitetura | Código | BD | Qualidade | Utilização | Instruções AWS |
---|
Banco de Dados
Descrição
Para o desenvolvimento do projeto, a tecnologia de banco de dados escolhida foi SQL (Structured Querying Language), ou seja, um banco de dados relacional. Utilizamos o PostgreSQL, que resolve tecnicamente as necessidades do projeto como, comportar a estrutura de dados (que é simples e raramente precisará de alterações). Em função de o projeto ter um eventual lançamento pelo Hospital São Lucas da PUCRS, o PostgreSQL acaba por ser uma ótima opção, pois a infraestrutura de sistemas de T.I. do hospital é mantida pelo mesmo departamento que mantém a da universidade e este departamento já está acostumado a usar o PostgreSQL.
Outro ponto importante para a decisão pelo PostgreSQL, é a fácil integração com aplicações Java utilizando o JPA para gerar e integrar o banco de dados à aplicação. O JPA (Java Persistance API) é um framework utilizado para persistir os objetos Java, fazendo o Mapeamento Objeto-Relacional., ou ORM. Ela permite que sejam feitas querys através de uma linguagem específica, a JPQL e retornar os dados já em forma de objetos Java.
Sumário
Modelagem
Esquema Conceitual
- Download do arquivo em formato brModelo (.brM3): Baixar ConceitualHSL.brM3
Esquema Lógico
- Link para visualizar o projeto (Lucid Chart): Clique aqui
Implementação
Schemas
Announcements
@Entity
@Table(name = "announcements")
@Data
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Proxy(lazy = false)
public class Announcement {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "idDepartment", referencedColumnName="id")
private Department department;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String content;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "idAttachment")
private List<Attachment> attachments;
@Column(nullable = false)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm", iso = DateTimeFormat.ISO.DATE_TIME)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
private LocalDateTime date;
@Transient
private boolean viewed;
}
Attachments
@Entity
@Table(name = "attachments")
@Data
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Proxy(lazy = false)
public class Attachment {
@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String fileName;
@Transient
private String contentAsBase64;
}
Departments
@Entity
@Table(name = "departments")
@Data
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Proxy(lazy = false)
public class Department {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String branchLine;
@Column(nullable = false)
private String email;
}
Users
@Entity
@Table(name = "users")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Proxy(lazy = false)
public class User {
@Id
@Column(nullable = false)
private Long registry;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private boolean isAdmin;
@Column(nullable = false)
private int day;
@Column(nullable = false)
private int month;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "idDepartment", referencedColumnName = "id")
private Department department;
@Column
private boolean active;
@Column
private String email;
@Column
private String phone;
@Column
@JsonIgnore
private String mobileEndpointArn;
@Column
@JsonIgnore
private String mobileEndpointSubscriptionArn;
@Column(nullable = false)
private String occupation;
}
UserAnnouncementViews
@Entity
@Table(name = "users_announcements_view")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserAnnouncementView {
@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
@JoinColumn(name = "idUser", referencedColumnName = "registry")
private User user;
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
@JoinColumn(name = "idAnnouncement", referencedColumnName = "id")
private Announcement announcement;
@Column
private boolean viewed;
}