Ha mai senso NON condensare le relazioni uno a uno?


12

Se abbiamo una tabella A che ha una relazione uno a uno con la tabella B, ha mai senso tenerli separati? O non fa mai male combinarli in un unico tavolo? Uno di questi scenari (due tabelle contro una tabella combinata) influisce su qualcosa rispetto alla sua forma normale (1NF, 2NF, 3NF, ecc.)?


5
Intendi 1-a-1 o 1-a-0-o-1?
jpmc26,

Risposte:


30

Sì, ci sono molte ragioni per cui questo potrebbe essere il design migliore.

Potresti avere una relazione di ereditarietà / estensione, ad esempio potresti avere una Usertabella e quindi una Administratortabella con più campi. Entrambe le tabelle possono avere una chiave primaria di ID utente (e quindi avere una relazione 1: 1) ma non tutti gli utenti avranno un record nella Administratortabella. Avresti bisogno di qualcosa di simile se stai supportando un flusso di lavoro, ad esempio una ScheduledTasktabella e una CompletedTasktabella.

Potresti voler avere una tabella leggera per i dati di uso comune Usere quindi una tabella più grande per i dettagli che non ti servono molto spesso UserDetails. Questo può migliorare le prestazioni perché sarai in grado di adattare più record in una singola pagina di dati.

Potresti volere autorizzazioni diverse per le tabelle, ad es. UserEUserCredentials

Potresti desiderare strategie di backup diverse e quindi inserire due tabelle su partizioni diverse, ad esempio TransactioneTransactionArchive

Potresti aver bisogno di più colonne di quelle che possono essere supportate in una singola tabella, ad esempio se ci sono molte colonne di testo di grandi dimensioni che devi poter indicizzare e la tua piattaforma DB è limitata a pagine di dati 4K o quant'altro.


Se la tua tabella ha più colonne di quante possano essere supportate dal sistema di database, hai un problema di progettazione. Ma per il resto, la tua risposta è valida.
Robert Harvey,

2
D'accordo ... Sto cercando un elenco esaustivo, non pubblicando su ogni motivo.
John Wu,

Qual è il tuo background nei flussi di lavoro? Hai un software specifico che usi? Hai creato il tuo sistema di flusso di lavoro?
Robert Harvey,

1
Fisico = ha a che fare con vincoli fisici come prestazioni del server, dimensioni della pagina, indicizzazione, clustering, backup, ecc. Nessuno dei quali dovrebbe influire sulla progettazione logica. Da una prospettiva puramente logica, una singola entità dovrebbe essere concettualizzata come una singola tupla o riga all'interno di una singola tabella.
John Wu,

4
Collegamento "Una relazione uno a uno in un database relazionale si verifica quando un record o un campo padre ha solo zero o un record figlio."
John Wu,

6

Aggiungendo alla risposta eccellente di @ john-wu un altro, un altro motivo è quando hai un tipo BLOB di colonna come un'immagine.

Si desidera che quella colonna BLOB in una tabella separata, non solo per le query sulla tabella utente sia più rapida, ma anche perché è possibile spostare la tabella contenente il BLOB in un tablespace diverso su uno spazio di archiviazione più economico e più lento, mantenendo i dati più interrogati nella tablespace principale su una memoria più veloce.


3

Le relazioni uno a uno hanno davvero senso solo quando si desidera che il record correlato nella Tabella B sia facoltativo.

A volte quello che vuoi è un record di variante o Tagged Union . Ciò significa che hai più tabelle contenenti informazioni diverse, ma tutte relative alla tabella A in relazioni uno a uno. Quindi scegliere quale tabella associare in base a un campo nella Tabella A

Per esempio:

type Transaction(The_Type: PaymentType := Cash) is record

    Amount: Integer;

    case The_Type is
        when Cash =>
            Discount: boolean;
        when Check =>
            CheckNumber: Positive;
        when Credit =>
            CardNumber: String(1..5);
            Expiration: String(1..5);
    end case;
end record;

Se è facoltativo, in cosa differisce da tutto ciò che si trova in una tabella e solo selezionando le colonne desiderate?
Il 29 Saltshaker,

Prendi il costo di avere quei campi aggiuntivi nella tabella principale, anche se non c'è nulla in essi. Se ci sono più tabelle nel record della variante, potresti avere 100 colonne in una singola tabella, la maggior parte delle quali non vengono utilizzate la maggior parte del tempo.
Robert Harvey,

2

Nella modellazione aziendale, due entità A e B che logicamente sono separate dal punto di vista aziendale in genere vengono mappate su tabelle diverse.

Ad esempio, quando si esegue la modellazione aziendale con mezzi orientati agli oggetti, in genere è in atto un qualche tipo di mappatura relazionale degli oggetti. Potresti iniziare con un modello a oggetti e derivarne il tuo modello relazionale. Quindi immagina nel tuo modello di oggetto di aver creato le classi A e B, che, sebbene gli oggetti abbiano una corrispondenza 1: 1, dovrebbero rimanere separati a causa del principio di responsabilità singola . Nota nel tuo modello a oggetti, queste classi non sono solo tabelle con attributi, potrebbero rappresentare oggetti business, con alcuni comportamenti implementati nei metodi. E quando si mappano quelle classi ora direttamente a un modello relazionale, si ottengono tabelle separate A e B con relazione 1: 1.

Secondo la mia esperienza, quando si crea un modello di dati aziendali o OO, questa separazione logica è molto più tipica per le relazioni 1: 1 rispetto a ragioni "fisiche" come prestazioni, sicurezza individuale o partizionamento.


Puoi fare un esempio concreto di cosa intendi?
Il 29 Saltshaker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.