dgterritorio / RECART

GNU Affero General Public License v3.0
24 stars 15 forks source link

Falta UNIQUE constraints em tabelas de ligação n:m #41

Closed SrNetoChan closed 2 years ago

SrNetoChan commented 3 years ago

Reparei que as tabelas de ligação não contém contraints para evitar repetição de ligações. Ou seja, é possível estabelecer a mesma ligação entre dois elementos todas as vezes que quisermos.

CREATE TABLE lig_valor_tipo_equipamento_coletivo_equip_util_coletiva (
    identificador uuid NOT NULL DEFAULT uuid_generate_v1mc(),
        equip_util_coletiva_id uuid NOT NULL,
    valor_tipo_equipamento_coletivo_id varchar(10) NOT NULL,
    PRIMARY KEY (identificador)
);

Para adicionar uma constraint composta pelas duas colunas, basta adicionar o seguinte:

CREATE TABLE lig_valor_tipo_equipamento_coletivo_equip_util_coletiva (
    identificador uuid NOT NULL DEFAULT uuid_generate_v1mc(),
        equip_util_coletiva_id uuid NOT NULL,
    valor_tipo_equipamento_coletivo_id varchar(10) NOT NULL,
    PRIMARY KEY (identificador),
        UNIQUE (equip_util_coletiva_id, valor_tipo_equipamento_coletivo_id)
);

Entretanto, havendo duas colunas NOT NULL e com a constraint UNIQUE, elas próprias constituem uma chave primária, não havendo necessário existir o campo "identificador". Qualquer coisa como:

CREATE TABLE lig_valor_tipo_equipamento_coletivo_equip_util_coletiva (
        equip_util_coletiva_id uuid NOT NULL,
    valor_tipo_equipamento_coletivo_id varchar(10) NOT NULL,
        PRIMARY KEY (equip_util_coletiva_id, valor_tipo_equipamento_coletivo_id)
);

Penso que a alteração simplificaria o modelo e o tornaria mais robusto.

SrNetoChan commented 3 years ago

Entretanto estive a pensar sobre este assunto, e embora a implementação de constraints UNIQUE faça sentido, para ajudar na produção, podia ser implementado uma RULE DO INSTEAD que pudesse ignorar a inserção na tabela se encontrasse já uma relação existente. Assim, ao contrário da constraint, evitava-se a devolução de um erro e o impedir de gravar as alterações.

dgterritorio commented 2 years ago

As constraints foram introduzidas em https://github.com/dgterritorio/RECART/commit/df01a6713388880e24b2b04e9c66dffed6f6d423 Se quiser propor uma solução alternativa, pode fazer através de pull request.

Obrigado pela colaboração.