Un tavolo a una colonna è un buon design? [chiuso]


111

Va bene avere una tabella con una sola colonna? So che non è tecnicamente illegale, ma è considerato un design scadente?

MODIFICARE:

Ecco alcuni esempi:

  • Hai una tabella con i 50 codici di stato degli Stati Uniti validi, ma non è necessario memorizzare i nomi di stato dettagliati.
  • Una lista nera di e-mail.

Qualcuno ha menzionato l'aggiunta di un campo chiave. Per come la vedo io, questa singola colonna SAREBBE la chiave primaria.


Ho qualche problema a immaginare un caso d'uso per una tabella con una sola colonna. Puoi fare un esempio?
Paul Morie

ma almeno non creare un indice per esso!
Sathya

3
I codici di stato degli Stati Uniti sono un classico esempio di definizione di un dominio
Quassnoi,

3
Ho già visto una tabella di database utilizzata per contenere un valore di blocco per un'applicazione prima
Russ Cam

Il mio utilizzo per questo modello era creare insiemi di dati. Ogni record nella tabella principale ha un campo SET. I record con lo stesso SET sono collegati. Come si inseriscono più record con lo stesso SET? 'INSERT INTO sets VALUES ()' e quindi utilizza l'ultimo ID di inserimento come SET ID da allegare ai record. Poi di nuovo, forse avrei potuto usare gli UUID, ma qualcosa sembra sbagliato in questo.
William Entriken

Risposte:


87

Sì, è certamente un buon design progettare un tavolo in modo da renderlo più efficiente. Il "cattivo design RDBMS" è solitamente incentrato sull'inefficienza.

Tuttavia, ho riscontrato che la maggior parte dei casi di progettazione a colonna singola potrebbe trarre vantaggio da una colonna aggiuntiva. Ad esempio, i codici di stato possono in genere avere il nome completo dello stato enunciato in una seconda colonna. Oppure una lista nera può avere note associate. Ma se il tuo progetto non ha davvero bisogno di queste informazioni, allora è perfettamente ok avere la singola colonna.


168

In termini di relational algebraquesto sarebbe una relazione unaria, che significa " questa cosa esiste "

Sì, va bene avere una tabella che definisca tale relazione: ad esempio, per definire un dominio.

I valori di tale tabella dovrebbero essere naturalmente chiavi primarie naturali.

Una tabella di ricerca di prime numbersè ciò che mi viene in mente per primo.


3
+1: la tabella è un insieme di valori che sono tipi primitivi del tuo RDBMS.
S.Lott,

4
+1 per fornire una risposta basata sulla teoria relazionale.
lubos hasko,

Ecco un buon esempio di uno schema che ha una tabella 1 colonna che non è una chiave naturale, la tabella di fili in un sistema di messaggistica ... stackoverflow.com/a/6542556/45767
JeremyWeir

29

Li ho usati in passato. Un mio cliente voleva bloccare automaticamente chiunque cercasse di registrarsi con un numero di telefono in questa grande lista che aveva, quindi era solo una grande lista nera.


19

Se ce n'è una valida necessità, non vedo alcun problema. Forse vuoi solo un elenco di possibilità da visualizzare per qualche motivo e vuoi essere in grado di cambiarlo dinamicamente, ma non hai bisogno di collegarlo a un'altra tabella.


+1 - In conclusione, questa è la risposta giusta nel mio libro
Mark Brittingham,

+1 per una risposta chiara e concisa.
Matthew Jones

3
Perché una tabella a una colonna non può essere collegata a un'altra tabella?
Aheho

2
Perchè no? Prendi la tabella dei codici di stato come esempio. Perché non dovresti usarlo come vincolo di chiave foriegn contro un'altra tabella con campi indirizzo?
Aheho

1
Questo è un ottimo esempio di un momento in cui sarebbe stata una buona idea.
Kevin,

11

Un caso che ho trovato a volte è qualcosa del genere:

La tabella countries_id , contiene solo una colonna con ID numerico per ogni paese.

La tabella countries_description , contiene la colonna con l'ID del paese, una colonna con l'ID della lingua e una colonna con il nome del paese localizzato.

La tabella company_factories , contiene le informazioni per ciascuna fabbrica dell'azienda, incluso il paese in cui si trova.

Quindi, per mantenere la coerenza dei dati e i dati indipendenti dalla lingua nelle tabelle, il database utilizza questo schema con tabelle con una sola colonna per consentire chiavi esterne senza dipendenze dalla lingua.

In questo caso penso che l'esistenza di una tabella di colonna sia giustificata.

Modificato in risposta al commento di: Quassnoi


(fonte: ggpht.com )

In questo schema posso definire una chiave esterna nella tabella company_factories che non mi richiede di includere la colonna Language nella tabella, ma se non ho la tabella countries_id, devo includere la colonna Language sulla tabella per definire la chiave esterna .


2
Perché avere countries_id? Per inserire un paese, è necessario conoscerne il nome in almeno una lingua e ciò comporterà la visualizzazione di country_id in countries_description. Un country_id senza la voce countries_description non ha significato. "Mr. Barack Obama, Presidente di COALESCE (14243, country_name) RETURNED NULL VALUE, ha incontrato oggi Dmitry Medvedev, Presidente di Россия"
Quassnoi

4
@Doliveras: OK, ora vedo, +1. Tuttavia, preferisco usare ISO 3166-1 per coutry_code. A differenza dell'ID numerico, un codice paese di 3 lettere dà un'idea di quale paese viene menzionato a quasi tutti coloro che sanno leggere l'alfabeto latino.
Quassnoi,

Ecco un altro modo che ho implementato per adattare le traduzioni in linguaggio naturale nella stessa tabella. Certo, molti campi sono annullabili di conseguenza, ma puoi trasferire l'integrità dei dati a trigger personalizzati. CREATE TABLE "DBA". "MyLocalisedTable" ("entry_id" INTEGER NOT NULL DEFAULT AUTOINCREMENT, "master_entry_id" INTEGER NULL, "master_entry_label" VARCHAR (200) NULL, "language_id" INTEGER NULL, "localised_entry_label" VARCHAR (300) NULL,
Vincent Buck,

7

Ci sarebbero rari casi in cui una tabella a colonna singola ha senso. Ho creato un database in cui l'elenco dei codici di lingua validi era una tabella a colonna singola utilizzata come chiave esterna. Non aveva senso avere una chiave diversa, poiché la chiave era il codice stesso. E non c'era una descrizione fissa poiché le descrizioni del codice della lingua variavano in base alla lingua per alcuni contesti.

In generale, ogni caso in cui è necessario un elenco autorevole di valori che non hanno attributi aggiuntivi è un buon candidato per una tabella a una colonna.


5

Uso sempre tabelle a colonna singola, a seconda, ovviamente, se il design dell'app utilizza già un database. Dopo aver sopportato il sovraccarico di progettazione di stabilire una connessione al database, ho inserito tutti i dati modificabili in tabelle, ove possibile.

Posso pensare a due usi delle tabelle a colonna singola OTMH:

1) L'elemento dati esiste. Spesso utilizzato negli elenchi a discesa. Utilizzato anche per semplici test di legittimità.

Per esempio. abbreviazioni di stato USA di due lettere; Codici di avviamento postale a cui spediamo; parole legali in Scrabble; eccetera.

2) Attributo binario sparse, cioè, in una grande tabella, un attributo binario che sarà vero solo per pochissimi record. Invece di aggiungere una nuova colonna booleana, potrei creare una tabella separata contenente le chiavi dei record per i quali l'attributo è vero.

Per esempio. dipendenti che hanno una malattia terminale; banche con un anno di 360 giorni (la maggior parte utilizza 365 giorni); eccetera.

-Al.



4

Per lo più l'ho visto nelle tabelle dei tipi di ricerca come la tabella degli stati che hai descritto. Tuttavia, se lo fai, assicurati di impostare la colonna come chiave primaria per forzare l'univocità. Se non puoi impostare questo valore come unico, non dovresti utilizzare una colonna.


Sebbene l'utilizzo di una singola colonna qui probabilmente vada bene, tieni presente che puoi impostare vincoli di unicità anche su altre colonne.
Stealth Rabbi,

2

In generale, direi di sì. Non sono sicuro del motivo per cui hai bisogno di una sola colonna. Ci sono alcune eccezioni a questo che ho visto utilizzate in modo efficace. Dipende da cosa stai cercando di ottenere.

Non sono davvero un buon design quando si pensa allo schema del database, ma dovrebbero essere usati solo come tabelle di utilità.

Ho visto tabelle numeriche utilizzate in modo efficace in passato.


1

Lo scopo di un database è mettere in relazione parti di informazioni tra loro. Come puoi farlo quando non ci sono dati a cui fare riferimento?

Forse questa è una sorta di tabella di compilazione (ad esempio FirstName + LastName + Birthdate), anche se non sono ancora sicuro del motivo per cui dovresti farlo.

EDIT: ho potuto vedere l'utilizzo di questo tipo di tabella per un semplice elenco di qualche tipo. È per questo che lo stai usando?


9
No, lo scopo principale di un database è memorizzare le informazioni.
Spencer Ruport

Ma un foglio di calcolo può memorizzare informazioni. E come sono utili le informazioni se sono solo un mucchio di numeri e lettere disgiunti senza alcuna correlazione tra loro?
Matthew Jones

Le informazioni possono essere utili perché l'applicazione che utilizza il database ne ha bisogno e non è un set fisso. Cioè, il DB è semplicemente il posto più conveniente in cui inserire le informazioni da utilizzare da un'app di database, relazionale o meno. Sono abbastanza sicuro che saresti d'accordo sul fatto che non stiamo costruendo app per dimostrare la nostra purezza rispetto all'ideale relazionale. Invece, creiamo app per essere utili.
Mark Brittingham

@Mark - Questo è ciò che intendevo con un semplice elenco. Immagino di non essermi spiegato molto bene.
Matthew Jones

1
@SR - No, lo scopo principale di un database è recuperare le informazioni. Poiché le righe di interesse il più delle volte dipendono da altri dati, penso che il commento originale di MJ sia valido.
CurtainDog,

1

Sì, purché il campo sia la chiave primaria come hai detto che sarebbe stata. Il motivo è perché se inserisci dati duplicati, quelle righe saranno di sola lettura. Se provi a eliminare una delle righe duplicate. non funzionerà perché il server non saprà quale riga eliminare.


2
È ridicolo. Un'operazione di eliminazione senza una chiave primaria o un vincolo eliminerà tutte le righe corrispondenti, non le ignorerà.
Erik Funkenbusch

1
Con "non funziona", potrebbe significare "non funziona come previsto", che copre la condizione "ehi, ho cancellato una riga ma non ci sono più".
GWLlosa

Oppure, se provi a eliminare un record in SSMS dalla vista "Apri tabella", verrà effettivamente visualizzata una finestra di dialogo in cui il record non può essere identificato in modo univoco e quindi non farà nulla ...
Michael Fredrickson

-1

L'unico caso d'uso che riesco a concepire è una tabella di parole forse per un gioco di parole. Si accede alla tabella solo per verificare che una stringa sia una parola: selezionare la parola dalle parole dove parola =?. Ma ci sono strutture di dati di gran lunga migliori per contenere un elenco di parole rispetto a un database relazionale .

In caso contrario, i dati in un database vengono solitamente inseriti in un database per sfruttare le relazioni tra i vari attributi dei dati. Se i tuoi dati non hanno attributi oltre al loro valore, come verranno sviluppate queste relazioni?

Quindi, sebbene non sia illegale, in generale probabilmente non dovresti avere una tabella con una sola colonna.


Simile a questa è la tabella dei numeri che è molto utile per interrompere il ciclo.
u07ch

-1

Tutte le mie tabelle hanno almeno quattro campi tecnologici, chiave primaria seriale, timestamp di creazione e modifica e booleano di eliminazione soft. In qualsiasi lista nera, vorrai anche sapere chi ha aggiunto la voce. Quindi per me, la risposta è no, una tabella con una sola colonna non avrebbe senso tranne quando si prototipa qualcosa.


1
Sembra che tu stia mescolando una tabella dati con una tabella delle transazioni. A mio parere, queste dovrebbero essere due cose separate.
Josh Noe

-2

Sì, va benissimo. ma un campo ID non potrebbe danneggiarlo, giusto?


7
In realtà, può. Quando hai un elenco definitivo di valori validi, l'ultima cosa che desideri è un campo ID perché implica che i valori non sono univoci. Se "LightBlue" è una chiave, non vuoi che qualcuno pensi che "LightBlue" con id 1 potrebbe essere diverso da "LightBlue" con id 4.
Jeremy Bourque

Chi dice che l'id deve essere identità? O parte della chiave?
Eric,

3
Potrebbe essere una chiave sintetica e il campo originale potrebbe avere un vincolo univoco.
Mark Canlas
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.