Come modellare una relazione one-mandatory-of-many

2

Ho seguito un modello di classe di cui sono abbastanza soddisfatto:

AWholehaunospeciale%obbligatoriodiPart.Inoltrehaunacollezionediparti,checontienealmenolaparteobbligatoria,mapuòconteneremoltealtre.NellepartidelmodelloOOnonènecessariosaperedoveappartengono.

CosìoramisonoinventatoquestomodelloRDB:

Whole:id-primarykeyspecial_part_id-non-nullable,unique,foreignkeytoPartPart:id-primarykeywhole_id-non-nullable,foreignkeytoWhole

L'unicovincolochenonèstatocontrollatoquièWhole=Whole.special_mandatory_part.whole.

Tuttavia,conquestolayoutditabellanonsononemmenoingradodiinserirerighe.ValelapenaricordarechestousandounORM,maancheconSQLsemplicenonsapreicomefarlo.

Quindilemiedomandesono:

  • QuestoDBnonfunzionabenee,incasoaffermativo,perché?
  • Incasocontrario,comeinserirestilerighe?
  • Chetipodidesignconsiglierestieperché?

Sonoaconoscenzadi questo molto domanda simile . Tuttavia, a causa del vincolo di not null il mio problema è leggermente diverso (peggio direi) e non sono soddisfatto delle risposte fornite.

UPDATE Hai appena trovato una risposta su come inserire righe con un layout di tabella come questo .

    
posta raphinesse 10.07.2014 - 16:41
fonte

2 risposte

2

Prima gli errori evidenti:

  • special_part_id in Whole non dovrebbe esistere
  • whole_id in Part dovrebbe essere un FK a Whole , non all'utente

In questo modo le relazioni sono che Whole è composto da una o più parti.

Ora per chiarire qualcosa:

  • Concettualmente puoi modellare una relazione uno-a-molti che è obbligatoria in entrambi i modi, ma fisicamente non è possibile implementarla. Puoi implementarla solo da un lato obbligatoria e non obbligatoria nell'altro. In questo caso, è obbligatorio sul lato della parte, ma facoltativo sul lato intero.
risposta data 10.07.2014 - 16:55
fonte
0

Smetti di provare a modellare le regole di business nel tuo database, è una perdita di tempo che non ti porterà dove. Ti distrae anche dal modellare queste regole dove è appropriato farlo, il tuo livello dell'oggetto aziendale.

I database hanno solo un lavoro, e questo è per mantenere lo stato dell'applicazione.

Si prega di non prendere questo per significare che i controlli di integrità referenziale di base non sono una buona idea; loro sono. Ma, quando si tratta della minuzia, come X deve avere una Y, questo è il ruolo della tua applicazione.

Potrebbe essere più flessibile aggiungere una colonna IsPartRequired (bit) alla tabella delle parti e lasciare che l'applicazione esegua l'applicazione. Potrebbe anche essere possibile che tu stia cercando di mettere qualcosa nel DB che non ha bisogno di essere lì affatto.

    
risposta data 17.04.2017 - 20:19
fonte

Leggi altre domande sui tag