2010-08-31 4 views
12

Voglio implementare il concetto uno-a-molti nella mia applicazione. Questo è lo scenario: ho due tabelleCome implementare ONE-TO-MANY in un database

(i). Persona (ID, NOME, ETÀ, DEPT)
(ii). Responsabilità della persona (ID, RESP'S)

Una persona può avere più di una responsabilità. Come devo implementare una relazione 1-n qui? In realtà, non capisco i concetti corretti per questo.

Qualsiasi suggerimento o collegamento per comprendere questo concetto sarebbe apprezzato.

risposta

16

Questo uno-a-molti può essere interpretato in inglese pianura come questo ...

una persona ha una o più responsabilità,

E

Ogni responsabilità appartiene a una persona esattamente .

Ora, a seconda di quali rdbms stai usando, dovresti implementarlo come una relazione di chiave esterna.

Per prima cosa è necessario aggiungere una colonna a RESPS che punta alla tabella delle persone.

Chiamiamo questa nuova colonna PERSON_ID.

Ora possiamo dichiarare la relazione, il codice potrebbe essere simile a questo;

ALTER TABLE [Responsibilities] ADD CONSTRAINT FOREIGN KEY (PERSON_ID) 
REFERENCES [Person] (ID) 

E questa dichiarazione di un vincolo di chiave esterna vorrebbe dire che da ora in poi non è possibile aggiungere una responsabilità senza specificare una persona che possiede quella responsabilità.

Ma si potrebbe ancora aggiungere una persona senza responsabilità (ancora) poiché non ci sono vincoli sulla tabella delle persone.

Si noti che questo è tutto un tipo di accademico, poiché nella vita reale le responsabilità sono condivise.

In altre parole, una persona potrebbe avere una o più responsabilità, ma ciascuna responsabilità potrebbe appartenere a una o più persone.

Questa si chiama una relazione molti-a-molti ed è un noto problema di progettazione del database con una soluzione ben definita, che non entrerò ora poiché è tangenziale alla tua domanda.

+0

Per le relazioni uno a molti sopra, le Responsabilità avranno PersonID come chiave esterna. La tabella Persona può avere ResponsibilityID come chiave esterna? Non mi sembra giusto, ma ho bisogno di sapere il motivo per cui è sbagliato avere chiavi esterne su entrambi i tavoli genitori e figli .. – ATHER

0

Cosa avrete finalmente hai è un tavolo composto da due colonne (solo per le responsabilità):

PersonId, Responsabilità

E così si può avere qualcosa di simile

1000 , TakeCareOfGraden
1000, TakeCareOfServerRoom

Il che significa che una persona con Pers onId = 1000 è responsabile per entrambi.

La chiave qui è una chiave composita che include entrambi i campi (poiché nessuno dei due è univoco).