Você está na página 1de 7

I.

Suponha que você foi contratado como engenheiro para desenvolver um sistema de
monitoramento de níveis de água em tanques de resfriamento de caldeiras. Seu
objetivo é projetar um diagrama de entidade e relacionamento (DER) para o sistema.

Dados os seguintes requisitos funcionais:

 O sistema deve monitorar o nível de água em cada tanque de resfriamento.


 O sistema deve alertar os operadores quando o nível de água em um tanque
estiver abaixo de um limite mínimo.
 O sistema deve manter um registro histórico dos níveis de água em cada tanque.
 O sistema deve ser capaz de gerar relatórios de tendências de níveis de água para
cada tanque.

Entidade: Tanque de resfriamento

Atributos:

 ID (identificador único do tanque)


 Capacidade (capacidade máxima do tanque)
 Localização (localização do tanque)

Entidade: Nível de água

Atributos:

 ID (identificador único do nível de água)


 Valor (valor do nível de água)
 Data e hora (data e hora da leitura do nível de água)

Entidade: Limite mínimo de nível de água

Atributos:

 ID (identificador único do limite mínimo)


 Valor (valor do limite mínimo)

Entidade: Alerta

Atributos:

 ID (identificador único do alerta)


 Tipo (tipo de alerta, por exemplo, "nível de água abaixo do limite mínimo")
 Data e hora (data e hora do alerta)

Entidade: Relatório de tendências de níveis de água

Atributos:

 ID (identificador único do relatório)


 Tanque (ID do tanque de resfriamento)
 Data inicial e final (período de tempo para o relatório)
Relacionamentos:

 Tanque de resfriamento possui vários níveis de água (1:N)


 Tanque de resfriamento tem um limite mínimo de nível de água (1:1)
 Alerta é gerado quando o nível de água está abaixo do limite mínimo (N:1)
 Relatório de tendências de níveis de água é gerado para um tanque em um
período de tempo específico (1:N)

Comandos DDL:

CREATE TABLE Tanque_de_resfriamento (

ID INTEGER PRIMARY KEY,

Capacidade INTEGER,

Localizacao VARCHAR(255)

);

CREATE TABLE Nivel_de_agua (

ID INTEGER PRIMARY KEY,

Valor INTEGER,

Data_e_hora DATETIME,

Tanque_ID INTEGER,

FOREIGN KEY (Tanque_ID) REFERENCES Tanque_de_resfriamento(ID)

);

CREATE TABLE Limite_minimo_de_nivel_de_agua (

ID INTEGER PRIMARY KEY,

Valor INTEGER,

Tanque_ID INTEGER,

FOREIGN KEY (Tanque_ID) REFERENCES Tanque_de_resfriamento(ID)

);

CREATE TABLE Alerta (

ID INTEGER PRIMARY KEY,

Tipo VARCHAR(255),

Data_e_hora DATETIME,
Nivel_de_agua_ID INTEGER,

FOREIGN KEY (Nivel_de_agua_ID) REFERENCES Nivel_de_agua(ID)

);

CREATE TABLE Relatorio_de_tendencias_de_nivel_de_agua (

ID INTEGER PRIMARY KEY,

Tanque_ID INTEGER,

Data_inicial DATETIME,

Data_final DATETIME,

FOREIGN KEY (Tanque_ID) REFERENCES Tanque_de_resfriamento(ID)

);

Comandos DML:

INSERT INTO Tanque_de_resfriamento (ID, Capacidade, Localizacao) VALUES (1, 1000, 'Setor
A');

INSERT INTO Nivel_de_agua (ID, Valor, Data_e_hora, Tanque_ID) VALUES (1, 800, '2023-05-05
10:30:00', 1);

UPDATE Tanque_de_resfriamento SET Capacidade = 1200 WHERE ID = 1;

DELETE FROM Nivel_de_agua WHERE ID = 1;

Views

a) View que combina informações sobre níveis de água e alertas:

CREATE VIEW NiveisDeAguaEAlertas AS

SELECT NivelDeAgua.ID, NivelDeAgua.Valor, NivelDeAgua.DataHora, Alerta.Tipo,


Alerta.DataHora

FROM NivelDeAgua

JOIN TanqueDeResfriamento ON NivelDeAgua.TanqueID = TanqueDeResfriamento.ID

JOIN LimiteMinimoDeNivelDeAgua ON TanqueDeResfriamento.ID =


LimiteMinimoDeNivelDeAgua.TanqueID

LEFT JOIN Alerta ON NivelDeAgua.Valor < LimiteMinimoDeNivelDeAgua.Valor AND


Alerta.TanqueID = NivelDeAgua.TanqueID AND Alerta.Tipo = 'nível de água abaixo do limite
mínimo'

Essa View combina informações da tabela Nível de água com informações da tabela Alerta. Ela
seleciona o ID, o valor e a data/hora de cada leitura de nível de água, o tipo e a data/hora de
cada alerta gerado quando o nível de água está abaixo do limite mínimo. A View usa as tabelas
Tanque de resfriamento e Limite mínimo de nível de água para determinar o limite mínimo
para cada tanque e filtrar apenas os alertas relevantes. O resultado final é uma tabela virtual
que fornece uma visão geral dos níveis de água e alertas de todos os tanques de resfriamento.

b) View que mostra o histórico de níveis de água de um tanque:

CREATE VIEW HistoricoDeNiveisDeAgua AS

SELECT TanqueDeResfriamento.ID, TanqueDeResfriamento.Localizacao, NivelDeAgua.Valor,


NivelDeAgua.DataHora

FROM NivelDeAgua

JOIN TanqueDeResfriamento ON NivelDeAgua.TanqueID = TanqueDeResfriamento.ID

WHERE TanqueDeResfriamento.ID = <id do tanque>

Essa View mostra o histórico de níveis de água de um tanque específico. Ela seleciona o ID e a
localização do tanque, além do valor e da data/hora de cada leitura de nível de água para o
tanque selecionado. A View usa as tabelas Nível de água e Tanque de resfriamento e é filtrada
pelo ID do tanque especificado na cláusula WHERE. O resultado final é uma tabela virtual que
fornece uma visão detalhada do histórico de níveis de água para um tanque específico.

Procedure

a) Stored procedure para inserir um novo nível de água em um tanque de resfriamento:

CREATE PROCEDURE sp_inserir_nivel_agua (

@id_tanque INT,

@valor_nivel FLOAT,

@data_hora DATETIME

AS

BEGIN

SET NOCOUNT ON;

INSERT INTO nivel_agua (id_tanque, valor_nivel, data_hora)

VALUES (@id_tanque, @valor_nivel, @data_hora);

IF @valor_nivel < (SELECT valor FROM limite_minimo WHERE id_tanque = @id_tanque)


BEGIN

INSERT INTO alerta (id_tanque, tipo, data_hora)

VALUES (@id_tanque, 'nível de água abaixo do limite mínimo', @data_hora);

END

END

b) Stored procedure para gerar um relatório de tendências de níveis de água em um


período de tempo para um tanque de resfriamento:

CREATE PROCEDURE sp_gerar_relatorio_tendencias (

@id_tanque INT,

@data_inicial DATETIME,

@data_final DATETIME

AS

BEGIN

SET NOCOUNT ON;

SELECT data_hora, valor_nivel

FROM nivel_agua

WHERE id_tanque = @id_tanque

AND data_hora BETWEEN @data_inicial AND @data_final;

END

Functions

a) Função para recuperar o último valor do nível de água em um tanque de resfriamento:

CREATE FUNCTION getLastWaterLevel(tankId INT) RETURNS FLOAT

BEGIN

DECLARE lastLevel FLOAT;

SELECT valor INTO lastLevel

FROM `Nível de água`


WHERE `ID do tanque` = tankId

ORDER BY `Data e hora` DESC

LIMIT 1;

RETURN lastLevel;

END

b) Função para gerar um relatório de tendências de níveis de água para um tanque de


resfriamento em um período de tempo específico:

CREATE FUNCTION generateWaterLevelReport(tankId INT, startDate DATE, endDate DATE)


RETURNS TEXT

BEGIN

DECLARE report TEXT;

SET report = CONCAT('Relatório de tendências de níveis de água para o tanque ', tankId, '
entre ', startDate, ' e ', endDate, ':');

SELECT `Data e hora`, `Valor`

INTO report

FROM `Nível de água`

WHERE `ID do tanque` = tankId AND `Data e hora` BETWEEN startDate AND endDate

ORDER BY `Data e hora`;

RETURN report;

END

Trigger

a) Trigger para inserção de novos níveis de água


Essa trigger atualiza automaticamente o status do alerta quando um novo nível de
água é inserido na tabela "Nível de água", comparando o valor do nível com o valor do
limite mínimo.

CREATE TRIGGER atualiza_alerta AFTER INSERT ON `Nível de água`


FOR EACH ROW
BEGIN
DECLARE n_minimo INT;
SELECT Valor INTO n_minimo FROM `Limite mínimo de nível de água` WHERE ID =
NEW.ID;
IF NEW.Valor < n_minimo THEN
INSERT INTO Alerta (Tipo, `Data e hora`) VALUES ('nível de água abaixo do limite
mínimo', NOW());
END IF;
END;

b) Trigger para atualização de capacidade de tanques

Trigger para atualização de capacidade de tanques

CREATE TRIGGER atualiza_capacidade AFTER UPDATE ON `Tanque de resfriamento`

FOR EACH ROW

BEGIN

UPDATE `Limite mínimo de nível de água` SET Valor = (Valor / Capacidade) *


NEW.Capacidade WHERE ID = NEW.ID;

UPDATE `Nível de água` SET Valor = (Valor / Capacidade) * NEW.Capacidade WHERE ID =


NEW.ID;

END;

Você também pode gostar