Come posso contrassegnare una relazione 1: n come "predefinita"?

3

Ho una domanda "facile", ma dal momento che non sono un programmatore molto esperto mi piacerebbe sapere cosa alcuni di voi hanno da dire.

Se ho per esempio un Db chiamato MyDb con molte tabelle. Due di questi sono Company e Address .

La relazione tra loro è che un'azienda può avere molti indirizzi (ciascuno per un ufficio o per uno sth)

Quindi ora ci stavo pensando e mi chiedevo come sarebbe stato implementato un indirizzo "predefinito".

Immagino 2 diversi approcci:

  1. Crea campi CompanyId e Default (booleano / bit) nella tabella Address . Se Default è true, questa voce è l'indirizzo predefinito.
  2. Crea campi CompanyId in Address e AddressId in Company , che rappresenta l'indirizzo predefinito effettivo .

Questo non è il mio problema specifico, è un progetto generico, per così dire.

Quindi, ora quale è l'approccio migliore? 2 mi sembra davvero stupido. Con 1 come evitare di avere 2 valori predefiniti come veri? Voglio dire non nel codice, basta lasciare il DB a fare questo (come dice sth. Quando inserisci un tipo sbagliato in un campo?

    
posta R. Gomez 29.11.2017 - 22:22
fonte

3 risposte

5

Di solito c'è una tabella di collegamento tra Azienda e Indirizzo in una relazione molti a molti. Chiamiamolo Company_Address.

Company_Address avrebbe Company_Id e Address_Id con relazioni a Società e Indirizzo. Avrebbe anche una colonna aggiuntiva; l'indicatore di default.

Le tabelle Società e Indirizzo non avrebbero alcun indicatore predefinito. Il tavolo del joiner può anche avere altri campi se necessario. Se si modifica l'indirizzo di default per una società, si aggiornerebbero i record della tabella dei joiner come necessario.

    
risposta data 29.11.2017 - 22:51
fonte
2

Il tuo primo esempio è perfettamente ragionevole. Basta avere il campo default nella tabella degli indirizzi. Questa è una relazione uno-a-molti. E il "tipo di indirizzo" è un attributo della tabella degli indirizzi.

Se si desidera realmente uno schema di progettazione per impedire più indirizzi predefiniti per una società, creare una terza tabella denominata CompanyAddressDefault con due campi companyid e addressid. Quindi rendi companyid la chiave primaria.

    
risposta data 30.11.2017 - 04:16
fonte
1

Hai davvero due relazioni qui. Company -> Address è 1: n, ma Company -> Default Address è 1: 1.

Il modo canonico per modellare una relazione 1: n è mettere una chiave straniera sul lato n che punta al lato 1. In altre parole, inserisci una colonna Company id nella tabella Address . Lo stai già facendo.

Il modo canonico di modellare una relazione 1: 1 è con una chiave esterna su uno dei 1 lati. Poiché Company è l'unico 1 in tutte le relazioni tra Address e Company , devi inserire una colonna Default Address id nella tabella Company .

Si noti che l'uso di una tabella "joiner" non consente allo schema di far rispettare che deve essere un indirizzo predefinito. Se va bene, e lo trovi più pulito, allora così sia. Tuttavia, penso che la "bruttezza" che hai citato nella soluzione 2 fosse dovuta al fatto che dovevi aggiornare due tabelle quando creavo un nuovo indirizzo predefinito. Si noti che è anche necessario aggiornare due tabelle con una soluzione di tabella di joiner. Se devi aggiornare comunque due tabelle, preferirei andare con la soluzione con vincoli più forti e meno tabelle complessive.

    
risposta data 30.11.2017 - 15:39
fonte