Domanda

Stavo pensando l'altro giorno sulla normalizzazione, e si è verificato a me, non posso non pensare a un momento in cui ci dovrebbe essere un rapporto di 1:1 in un database.

Nome:SSN?Mi piacerebbe avere nella stessa tabella PersonID:AddressID?Di nuovo, la stessa tabella.

Posso venire con un'infinità di esempi di 1:molti o molti:molti (con opportune tabelle intermedie), ma mai un 1:1.

Mi manca qualcosa di ovvio?

È stato utile?

Soluzione

A 1: 1 rapporto indica in genere che si è partizionato un'entità più grande per qualche motivo. Spesso è a causa di motivi di prestazioni nello schema fisico, ma può succedere nel lato logico e se un grande pezzo di dati dovrebbe essere "sconosciuto" al tempo stesso (in questo caso si ha un 1: 0 o 1:. 1, ma non di più)

Come esempio di una partizione logica: si dispone di dati relativi a un dipendente, ma c'è un più ampio insieme di dati che devono essere raccolti, se e solo se scegliere di avere una copertura sanitaria. Vorrei mantenere i dati demografici riguardanti la copertura sanitaria in una tabella diversa sia per dare più facile partizionamento di sicurezza e per evitare che i dati trasportare in giro nelle query non correlate alle assicurazioni.

Un esempio di una partizione fisica sarebbe gli stessi dati ospitati su più server. Posso conservare i dati demografici copertura sanitaria in un altro stato (dove l'ufficio HR è, per esempio) e il database primario può solo creare un collegamento ad esso tramite un server collegato ... evitando la replica dei dati sensibili ad altri luoghi, ma rendendolo disponibile per (supponendo qui raro) query che ne hanno bisogno.

partizionamento fisico può essere utile quando avete domande che hanno bisogno di sottoinsiemi consistenti di un'entità più grande.

Altri suggerimenti

Uno dei motivi è l'efficienza del database. Avere una relazione 1: 1 permette di dividere i settori che saranno interessati nel corso di un blocco di riga / tabella. Se la tabella A ha una tonnellata di aggiornamenti e la tabella B ha una tonnellata di legge (o ha una tonnellata di aggiornamenti da un'altra applicazione), quindi bloccaggio tavolo di A non influenzerà quello che sta succedendo nella tabella B.

Altri far apparire un buon punto. La sicurezza può anche essere un buon motivo a seconda di come le applicazioni, ecc stanno colpendo il sistema. Vorrei tendono ad assumere un approccio diverso, ma può essere un modo semplice di limitare l'accesso a determinati dati. E 'davvero facile per negare l'accesso solo a un certo tavolo in un pizzico.

Il mio blog entry su di esso.

essenzialità. Il rapporto di dati può essere tecnicamente 1: 1, ma righe corrispondenti non devono esistere per ogni riga. Quindi, se avete una ventina di milioni di righe e c'è un insieme di valori che esiste solo per lo 0,5% di loro, il risparmio di spazio sono enormi se si spinge queste colonne fuori in una tabella che può essere scarsamente popolata.

La maggior parte delle risposte altamente ordinati dare ragioni molto utili tuning del database e di ottimizzazione per 1: 1 i rapporti, ma voglio mettere a fuoco su niente ma "in the wild" esempi in cui 1:. Si trovano naturalmente 1 rapporti

Si prega di notare una caratteristica importante di implementazione del database della maggior parte di questi esempi: nessuna informazione storica viene mantenuta la relazione 1: 1. Cioè, queste relazioni sono 1: 1 in un qualsiasi punto nel tempo. Se lo sviluppatore del database vuole registrare i cambiamenti nei partecipanti di relazione nel corso del tempo, allora le relazioni diventano 1: M o M: M; perdono il loro 1: 1 la natura. Con che ha capito, ecco qui:

  • "is-a", o supertipo / sottotipo o relazioni di ereditarietà / classificazione : questa categoria è quando un soggetto è un tipo specifico di un'altra entità. Ad esempio, ci potrebbe essere un'entità dipendente con attributi che si applicano a tutti i dipendenti e quindi soggetti diversi per indicare specifici tipi di dipendente con caratteristiche uniche per quel tipo dipendente, ad esempio Medico, commercialista, Pilota, ecc Questo design evita molteplici valori nulli in quanto molti dipendenti non avrebbero gli attributi specializzate di un sottotipo specifico. Altri esempi di questa categoria potrebbe essere prodotto come supertipo, e ManufacturingProduct e MaintenanceSupply come sottotipi; Animal come supertipo e Cane e gatto come sottotipi; ecc Si noti che ogni volta che si tenta di connettere una gerarchia di ereditarietà orientata agli oggetti in un database relazionale (ad esempio in un modello di oggetto-relazionale), questo è il tipo di relazione che rappresenta tali scenari.

  • rapporti "capo" , come direttore, presidente, presidente, ecc, dove un'unità organizzativa può avere un solo capo, e una persona può essere capo di una sola unità organizzativa . Se si applicano queste regole, allora si ha una relazione 1: 1, come ad esempio un manager di un dipartimento, un amministratore delegato di una società, ecc "Boss" relazioni non si applicano soltanto alle persone. Lo stesso tipo di rapporto si verifica se v'è un solo negozio come la sede di una società, o se una sola città è la capitale di un paese, per esempio.

  • Alcuni tipi di allocazione delle risorse scarse , per esempio un dipendente può essere assegnato solo una macchina società in un momento (per esempio un camion per ogni camionista, un Taxi per tassista, ecc). Un collega mi ha dato questo esempio di recente.

  • Matrimonio (almeno in giurisdizioni in cui la poligamia è illegale): una persona può essere sposata con una sola altra persona alla volta. Ho ottenuto questo esempio da un libro di testo che ha usato questo come un esempio di un 1: 1. Relazione unaria quando una società registra matrimoni fra i suoi dipendenti

  • prenotazioni corrispondenti : quando una prenotazione unica è fatta e quindi adempiuto come due entità separate. Ad esempio, un sistema di noleggio auto potrebbe registrare una prenotazione in un'unica entità, e poi un noleggio di reale in un'entità separata. Anche se una tale situazione potrebbe in alternativa essere concepito come un'unica entità, potrebbe avere senso per separare i soggetti dal momento che non tutte le prenotazioni sono soddisfatte, e non tutti i noleggi richiedono la prenotazione, e entrambe le situazioni sono molto comuni.

Ripeto il caveat che ho fatto in precedenza che la maggior parte di questi sono 1: 1 rapporti solo se nessuna informazione storica è registrato. Quindi, se un dipendente cambia il loro ruolo in un'organizzazione, o un manager si assume la responsabilità di un altro reparto, o un dipendente viene riassegnato un veicolo, o qualcuno è vedovo e si risposa, poi i partecipanti di relazione possono cambiare. Se il database non memorizza alcun precedente storia di questi 1: 1 relazioni, quindi rimangono legittima 1: 1 relazioni. Ma se il database registra informazioni storiche (come l'aggiunta di date di inizio e fine per ogni relazione), poi quasi tutti si trasformano in M:. Rapporti M

Ci sono due eccezioni ala nota storica: In primo luogo, alcune relazioni cambiano così di rado che le informazioni storiche normalmente non essere memorizzati. Ad esempio, la maggior is-a rapporti (ad esempio, tipo di prodotto) sono immutabili; cioè, non potranno mai cambiare. Così, il punto record storico è discutibile; questi sarebbero sempre essere implementate come naturali 1: 1 relazioni. In secondo luogo, il negozio rapporto prenotazione noleggio risale a parte, dal momento che la prenotazione e il noleggio sono eventi indipendenti, ognuno con le proprie date. Dal momento che i soggetti hanno le loro date, piuttosto che la relazione 1: 1 a dover una data di inizio, questi rimarrebbero come 1: 1. Rapporti, anche se le informazioni storiche viene stoccato

La tua domanda può essere interpretata in diversi modi, a causa del modo in cui si è formulata. Le risposte mostrano questo.

Non ci può sicuramente essere 1: 1 relazioni tra elementi di dati nel mondo reale. Non ci sono dubbi. Il "è un" rapporto è generalmente uno a uno. Una macchina è un veicolo. Una macchina è un veicolo. Un veicolo potrebbe essere una macchina. Alcuni veicoli sono camion, nel qual caso un veicolo non è una macchina. Diverse risposte affrontare questa interpretazione.

Ma penso che ciò che realmente si pongono è ... quando 1: 1 esistono relazioni, dovrebbero tabelle mai essere divisi? In altre parole, si dovrebbe mai avere due tabelle che contengono esattamente le stesse chiavi? In pratica, la maggior parte di noi solo analizzare le chiavi primarie, e non anche per altri chiavi candidate, ma a questa domanda è un po 'spettacolo diverso.

Le regole di normalizzazione per 1NF, 2NF, e 3NF non richiedono mai in decomposizione (splitting) una tabella in due tabelle con la stessa chiave primaria. Non ho lavorato capire se mettere uno schema in BCNF, 4NF, o 5NF posso risultato di sempre in due tabelle con gli stessi tasti. Fuori della parte superiore della mia testa, ho intenzione di indovinare che la risposta è no.

C'è un livello di normalizzazione chiamato 6NF. La formula di normalizzazione per 6NF può sicuramente portare a due tabelle con la stessa chiave primaria. 6NF ha il vantaggio rispetto 5NF che NULLS possono essere completamente evitato. Questo è importante per alcuni, ma non tutti, i progettisti di database. Non ho mai preso la briga di mettere uno schema in 6NF.

In 6NF dati mancanti possono essere rappresentano da una riga omessa, invece di una riga con un NULL in qualche colonna.

Non ci sono ragioni diverse normalizzazione per le tabelle di divisione. A volte le tabelle di divisione si traducono in migliori prestazioni. Con alcuni motori di database, è possibile ottenere gli stessi vantaggi di prestazioni suddividendo il tavolo in realtà invece di dividerlo. Questo può avere il vantaggio di mantenere la progettazione logica di facile comprensione, dando il motore di database gli strumenti necessari per accelerare le cose.

Io li uso principalmente per un paio di motivi.Uno è differenza significativa nel tasso di variazione dati.Alcune delle mie tabelle possono avere le piste di controllo, dove tiene traccia delle versioni precedenti di record, se mi interessa solo per tenere traccia delle versioni precedenti di 5 su 10 colonne di frazionamento quei 5 colonne su un tavolo separato con un audit trail meccanismo è più efficiente.Inoltre, devo record (per una contabilità app) che sono in sola scrittura.Non è possibile cambiare la quantità di dollaro, o l'account, per, se hai fatto un errore, allora avete bisogno di fare un record corrispondente a scrivere regolare off the record non corretto, quindi creare una voce di correzione.Ho vincoli sul tavolo di far rispettare il fatto che essi non possono essere aggiornate o eliminate, ma ho un paio di attributi di oggetti che sono malleabile, quelli sono conservati in una tabella separata, senza restrizione alcuna modifica.Un'altra volta lo faccio, è in medical record applicazioni.Non ci sono dati relativi a una visita che non può essere cambiato una volta firmato, e altri dati relativi a una visita che può essere modificata dopo la chiusura.In questo caso ho diviso i dati e mettere un trigger sulla bloccato tabella di rifiutare gli aggiornamenti di blocco al tavolo quando ha firmato, ma consentendo aggiornamenti ai dati il medico non è chiusura.

Un altro poster commentato 1:1 di non essere normalizzato, non sono d'accordo con che in alcune situazioni, soprattutto sottotipizzazione.Dire che ho una tabella dipendente e la chiave primaria è il loro SSN (è un esempio, proviamo a salvare il dibattito se questo è buono o non per altro thread).I dipendenti possono essere di diversi tipi, dire, temporanea o permanente, e se sono permanenti hanno più campi da compilare, come numero di telefono dell'ufficio, che deve essere non nullo se il tipo = 'Permanente'.Nella 3a forma normale database colonna non deve dipendere solo la chiave, il che significa che il dipendente, ma in realtà dipende dal dipendente e tipo, quindi, un rapporto di 1:1 è perfettamente normale, e auspicabile, in questo caso.Esso impedisce anche troppo sparse tabelle, se ho 10 colonne che sono normalmente pieni, ma 20 colonne aggiuntive solo per alcuni tipi.

Lo scenario più comune che viene in mente è quando si dispone di BLOB di. Diciamo che si desidera memorizzare immagini di grandi dimensioni in un database (in genere, non è il modo migliore per conservare loro, ma a volte i vincoli rendere più conveniente). Si potrebbe in genere desidera che il blob di essere in una tabella separata per migliorare le ricerche dei dati non-blob.

In termini di scienza pura, sì, sono inutili.

Nel database reali a volte è utile tenere un campo raramente utilizzato in una tabella separata: per velocizzare le query che utilizzano questo e solo questo campo; per evitare di serrature, ecc.

Invece di utilizzare una vista per limitare l'accesso ai campi, a volte ha senso per mantenere i campi ristretti in una tabella separata a cui solo alcuni utenti hanno accesso.

Posso anche pensare a situazioni in cui si dispone di un modello OO in cui si usa l'ereditarietà, e l'albero di ereditarietà deve essere persistente al DB.

Per esempio, si dispone di un uccello di classe e di pesce, che ereditano entrambi dalla Animal. Nel vostro DB si potrebbe avere una tabella di 'Animal', che contiene i campi comuni della classe degli animali, e la tabella degli animali ha una relazione uno-a-uno con la tabella uccello, e una relazione uno-a-uno con il pesce tavolo.

In questo caso, non è necessario disporre di una tabella degli animali che contiene un sacco di colonne nullable per tenere l'uccelli e pesci-proprietà, dove sono impostati su NULL tutte le colonne che contengono Pesce-dati quando il record rappresenta un uccello.

Al contrario, si ha un record nella uccelli-tavolo che ha una relazione uno-a-uno con il record della tabella degli animali.

1-1 rapporti sono necessarie anche se si dispone di troppe informazioni. V'è un limite di dimensione record su ciascun record della tabella. A volte le tabelle sono suddivise in due (con le informazioni più comunemente interrogato nella tabella principale) solo in modo che la dimensione record non sarà troppo grande. I database sono anche più efficienti in esecuzione di query se le tabelle sono strette.

E 'anche un modo per estendere una tabella che è già in produzione con meno rischi (percepita) di un cambiamento database "reale". Vedere un 1:. Rapporto 1 in un sistema legacy è spesso un buon indicatore che i campi sono stati aggiunti dopo il progetto iniziale

In SQL è impossibile imporre un rapporto 1: 1 tra due tabelle che è obbligatorio su entrambi i lati (a meno che le tabelle sono di sola lettura). Per la maggior parte degli scopi pratici "1: 1" relazione in SQL significa veramente 1: 0 | 1

.

L'incapacità di sostenere cardinalità obbligatoria in vincoli di riferimento è uno dei gravi limitazioni di SQL. vincoli "differibile" non contano, perché sono solo un modo di dire il vincolo non viene applicata un po 'del tempo.

Se si utilizza i dati con uno dei ORM popolari, si potrebbe desiderare di rompere un tavolo in più tabelle per abbinare la vostra gerarchia di oggetti.

Ho trovato che quando faccio un 1:. Rapporto 1 la sua totalmente per una ragione sistemica, non è un motivo relazionale

Per esempio, ho trovato che mettendo gli aspetti riservati di un utente in 1 tavolo e mettendo i campi modificabili utili dell'utente in una tabella diversa permette logicamente a scrivere queste regole sulle autorizzazioni su quei campi molto molto più facile <. / p>

Ma lei ha ragione, in teoria, 1: 1 rapporti sono completamente artificiosa, e sono quasi un fenomeno. Tuttavia logicamente permette i programmi e le ottimizzazioni astraendo il database più facile.

La maggior parte del tempo, i disegni sono pensati per essere 1: 1 fino a quando qualcuno chiede "bene, perché non può essere 1: molti"? Divorzio i concetti l'uno dall'altro prematuramente è fatto in previsione di questo scenario comune. Persona e indirizzo non si legano così strettamente. Un sacco di persone hanno più indirizzi. E così via ...

Di solito due spazi oggetto separato implica che uno o entrambi possono essere moltiplicati (x: molti). Se due oggetti erano veramente, veramente 1: 1, anche filosoficamente, allora è più di un è-relazione. Questi due "oggetti" sono in realtà parti di un intero oggetto.

informazioni estese che è necessaria solo in alcuni scenari. in applicazioni legacy e linguaggi di programmazione (come il gioco di ruolo) in cui i programmi vengono compilati i tavoli (quindi se la tabella cambia è necessario ricompilare il programma (s)). Tag lungo file possono anche essere utile nei casi in cui si deve preoccupare di dimensioni della tabella.

La maggior parte spesso è più di un fisico che costruzione logica. È comunemente usato per partizionare verticalmente una tabella di sfruttare splitting I / O su dispositivi fisici o altre ottimizzazioni query associata segregante meno frequentemente letta dati o dati che deve essere mantenuto più sicuro rispetto al resto degli attributi sullo stesso oggetto (SSN, Stipendio, ecc).

L'unica considerazione logica che prescrive un rapporto di 1-1 è quando certi attributi si applicano solo ad alcuni dei soggetti. Tuttavia, nella maggior parte dei casi si tratta di un / modo migliore e più normalizzata per modellare i dati tramite estrazione di entità.

Il motivo migliore che posso vedere per un rapporto di 1:1 è un Supertipo Sottotipo di progettazione di database.Ho creato un Real Estate MLS struttura di dati basate su questo modello.Ci sono cinque diversi feed di dati;Residenziale, Commerciale, Multifamiliare, Alberghi E Terreni.

Ho creato un Supertipo chiamato proprietà che conteneva i dati comuni a tutte le cinque diverse feed di dati.Questo ha permesso per molto veloce "semplice" ricerche in tutti i tipi di dati.

Creare cinque distinti Sottotipi memorizzati i dati univoci elementi, per ciascuno dei cinque feed di dati.Ogni SuperType record aveva un rapporto di 1:1 per le opportune Sottotipo record.

Se un cliente ha voluto una ricerca dettagliata che hanno dovuto selezionare un Super-Sub tipo per esempio PropertyResidential.

A mio parere una relazione 1: 1 mappa un Inheritance classe su un RDBMS. C'è un tavolo A, che contiene gli attributi comuni, vale a dire lo stato di classe partent Ogni stato classe ereditata è mappato sul RDBMS con una tabella B con un rapporto 1: 1 a una tabella, che contiene gli attributi specializzati. La tabella namend A contiene un campo "tipo" che rappresenta la funzionalità "casting"

Bye Mario

1: 1 i rapporti in realtà non hanno senso se siete in una normalizzazione come tutto ciò che potrebbe essere 1: 1. Sarebbe stata mantenuta nella stessa tabella

Nel mondo reale, però, è spesso diversa. Si consiglia di suddividere i dati fino a corrispondere l'interfaccia delle applicazioni.

Forse se si dispone di un qualche tipo di oggetti tipizzati nel database.

Dire in una tabella, T1, si hanno le colonne C1, C2, C3 ... con una relazione uno a uno. Va bene, è in forma normalizzata. Ora dire in T2 tavolo, si dispone di colonne C1, C2, C3, ... (i nomi possono essere diversi, ma dicono i tipi e il ruolo è lo stesso) con una relazione uno a uno anche. E 'OK per T2 per gli stessi motivi con T1.

In questo caso, tuttavia, vedo una misura per un T3 tabella separata, tiene C1, C2, C3 ... e una relazione uno a uno da T1 a T3 e da T2 a T3. Ho ancora di più vedere una misura se esistono un altro tavolo, con la quale già esiste uno a più C1, C2, C3 ... dire da tabella A a più righe nella tabella B. Poi, invece di T3, si usa B, e hanno una relazione uno a uno da T1 a b, la stessa dal T2 a b, e sempre la stessa per relazione multipla da a a b.

Credo che la normalizzazione non sono d'accordo con questo, e che potrebbe essere un'idea di fuori di esso: identificare i tipi di oggetto e spostare gli oggetti di uno stesso tipo al proprio lotto di memoria, utilizzando un rapporto 00:59 da alcuni tavoli, e un uno a relazione multipla da alcune altre tabelle.

È possibile creare una tabella relazione uno a uno se non v'è alcun vantaggio significativo delle prestazioni. È possibile inserire i campi raramente utilizzati nella tabella a parte.

E non v'è inutile grande per motivi di sicurezza, ma modi migliori per eseguire i controlli di sicurezza. Immaginate, si crea una chiave che può aprire una sola porta. Se la chiave può aprire qualsiasi altra porta, si dovrebbe suonare l'allarme. In sostanza, si può avere "CitizenTable" e "VotingTable". Citizen Un voto per un candidato che è memorizzato nella tabella di voto. Se cittadini uno compare nella tabella di voto ancora una volta, allora la loro dovrebbe essere un allarme. Un consiglio, questo è un rapporto uno a uno perché non riferendosi al campo candidato, stiamo riferendosi al tavolo di voto e la tabella dei cittadini.

Esempio:

 Citizen Table
 id = 1, citizen_name = "EvryBod"
 id = 2, citizen_name = "Lesly"
 id = 3, citizen_name = "Wasserman"

 Candidate Table
 id = 1, citizen_id = 1, candidate_name = "Bern Nie"
 id = 2, citizen_id = 2, candidate_name = "Bern Nie"
 id = 3, citizen_id = 3, candidate_name = "Hill Arry"

Quindi, se vediamo il tavolo di voto come:

 Voting Table
 id = 1, citizen_id = 1, candidate_name = "Bern Nie"
 id = 2, citizen_id = 2, candidate_name = "Bern Nie"
 id = 3, citizen_id = 3, candidate_name = "Hill Arry"
 id = 4, citizen_id = 3, candidate_name = "Hill Arry"
 id = 5, citizen_id = 3, candidate_name = "Hill Arry"

Si potrebbe dire che il numero dei cittadini 3 è un bugiardo pantaloni in fiamme che hanno truffato Berna Nie. Solo un esempio.

Ovunque erano due entità completamente indipendenti condividono una relazione uno-a-uno. Ci deve essere un sacco di esempi:

persona <-> dentista (! Suo 1: N, per cui il suo sbagliato)

persona <-> medico (! Suo 1: N, quindi è anche sbagliato)

persona <-> coniuge (! Suo 1: 0 | 1, per cui il suo lo più sbagliato)

Modifica Sì, quelli erano abbastanza cattivi esempi, in particolare se ero sempre alla ricerca di un 1: 1, non un 0 o 1 su entrambi i lati. Credo che il mio cervello era mis-combustione: -)

Quindi, ci riproverò. Si scopre, dopo un po 'di pensiero, che l'unico modo è possibile avere due entità separate che devono (per quanto riguarda il software va) stare insieme tutto il tempo è per loro di esistere insieme in alto categorizzazione. Poi, se e solo se si rientra in una decomposizione più bassa, le cose sono e devono essere separati, ma a livello più alto non possono vivere senza l'altro. Contesto, quindi è la chiave.

Per un database medico può essere utile per memorizzare le informazioni di diverso in regioni specifiche del corpo, tenendoli come entità separata. In tal caso, un paziente ha una sola testa, e hanno bisogno di avere, o non sono un paziente. (Hanno anche un cuore, e una serie di altre necessarie singoli organi). Se siete interessati a tracciare ambulatori per esempio, allora ogni regione dovrebbe essere un'entità separata unica.

In un sistema di produzione / inventario, se si sta monitorando l'assemblaggio dei veicoli, allora certamente desidera vedere lo stato di avanzamento del motore in modo diverso dal corpo macchina, eppure c'è una relazione uno a uno. Una cura deve avere un motore, e solo uno (o non sarebbe un 'auto' più). Un motore appartiene ad una sola auto.

In ogni caso si potrebbe produrre le entità separate come un grande record, ma dato il livello di decomposizione, che sarebbe sbagliato. Essi sono, in questi contesti specifici, soggetti realmente indipendenti, anche se potrebbe non apparire così a un livello superiore.

Paul.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top