Array
(
)

Relacionamento 0...1 na prática

Antunesleo
|
MVP
    08 jan 2016

Tendo as seguintes tabelas:
- pedido
- endereço
- mesa
Os pedidos podem ser efetuados na pizzaria, ou seja, para uma mesa. Pode ser uma entrega(endereço) ou pode ser um pedido para viagem, onde ele não pertence a ninguém. No SQL da tabela pedido, no momento tenho o seguinte:
#Código

    CREATE TABLE pedido  
    (  
    cod_ped INT NOT NULL,  
    cod_mesa INT,  
    cod_end INT,  
    val_ped DECIMAL(18,2),  
    tipo_ped CHAR(1) NOT NULL,   
    data_ins DATETIME,  
    CONSTRAINT pk_cod_ped  
    PRIMARY KEY(cod_ped),  
    CONSTRAINT fk_cod_mesa  
    FOREIGN KEY (cod_mesa)   
    REFERENCES mesa(cod_mesa),  
    CONSTRAINT fk_cod_end  
    FOREIGN KEY (cod_end)   
    REFERENCES endereco(cod_end),     
    );
   

porém, como explicado, um mesmo pedido pode pertencer tanto a 1 mesa/endereço quanto a nenhum. Criando a chave estrangeira, estaria obrigando este pedido a ter um endereço e uma mesa. Como resolver este problema?

Romário Beckman
   - 08 jan 2016

Olá antunesleo, o problema pode ser resolvido definindo os campos cod_mesa e cod_end como NULL. Uma dica, se você estiver utilizando MySql, baixe o MysqlWorkbench para modelagem.

#Código

cod_mesa INT NULL DEFAULT NULL,
cod_end INT NULL DEFAULT NULL,

Din
|
MVP
Pontos: 45
    08 jan 2016

Antunes, eu não colocaria nenhuma chave (PK ou FK) nula, até porque elas garantem que o relacionamento e a regra de negocio seja aplicada.

Talvez a sua solução seja de criar uma mesa e um endereço "coringa" onde todos os pedidos que sejam direcionados para entrega possam ser tabulados dessa forma.

Ou você terá que alterar sua modelagem para que possa contornar essa situação.

@rick_heronides
   - 14 jan 2016

Antunes, concordo com o Din:

Citação:
Talvez a sua solução seja de criar uma mesa e um endereço "coringa" onde todos os pedidos que sejam direcionados para entrega possam ser tabulados dessa forma.


Você criando esta "mesa" coringa irá te ajudar na hora de fazer o controle dos pedidos, pois você ter o controle de onde este pedido foi feito. O que acredito que sejam os pedidos feitos no caixa para viagem.

Isso te ajudará bastante na hora de gerar relatórios!