Ist eine einspaltige Tabelle ein gutes Design? [geschlossen]

111

Ist es in Ordnung, eine Tabelle mit nur einer Spalte zu haben? Ich weiß, dass es technisch nicht illegal ist, aber wird es als schlechtes Design angesehen?

BEARBEITEN:

Hier einige Beispiele:

  • Sie haben eine Tabelle mit den 50 gültigen US-Bundesstaatencodes, müssen jedoch die ausführlichen Statusnamen nicht speichern.
  • Eine E-Mail-Blacklist.

Jemand erwähnte das Hinzufügen eines Schlüsselfeldes. So wie ich es sehe, wäre diese einzelne Spalte der Primärschlüssel.

Aheho
quelle
Ich habe ein wenig Probleme, mir einen Anwendungsfall für eine Tabelle mit nur einer einzigen Spalte vorzustellen. Kannst du ein Beispiel geben?
Paul Morie
aber zumindest keinen Index dafür erstellen!
Sathya
3
US Zustand Codes sind klassisches Beispiel für eine Domäne definieren
Quassnoi
3
Ich habe eine Datenbanktabelle gesehen, die verwendet wurde, um einen Sperrwert für eine Anwendung zu speichern
Russ Cam
Ich habe dieses Muster verwendet, um Datensätze zu erstellen. Jeder Datensatz in der Haupttabelle hat ein SET-Feld. Datensätze mit demselben SET werden verbunden. Wie füge ich mehrere Datensätze mit demselben SET ein? 'INSERT INTO setzt VALUES ()' und verwendet dann die letzte Einfüge-ID als SET-ID, um sie an die Datensätze anzuhängen. Andererseits hätte ich vielleicht UUIDs verwenden können, aber daran fühlt sich etwas falsch an.
William Entriken

Antworten:

87

Ja, es ist sicherlich ein gutes Design, einen Tisch so zu gestalten, dass er am effizientesten ist. "Schlechtes RDBMS-Design" dreht sich normalerweise um Ineffizienz.

Ich habe jedoch festgestellt, dass die meisten Fälle des Entwurfs einer einzelnen Spalte von einer zusätzlichen Spalte profitieren könnten. Beispielsweise können Statuscodes normalerweise den vollständigen Statusnamen in einer zweiten Spalte enthalten. Oder einer schwarzen Liste können Notizen zugeordnet sein. Wenn Ihr Design diese Informationen jedoch wirklich nicht benötigt, ist es vollkommen in Ordnung, eine einzelne Spalte zu haben.

Erik Funkenbusch
quelle
168

In diesem Sinne relational algebrawäre dies eine unäre Beziehung, was bedeutet, dass " dieses Ding existiert ".

Ja, es ist in Ordnung, eine Tabelle zu haben, die eine solche Beziehung definiert: zum Beispiel, um eine Domäne zu definieren.

Die Werte einer solchen Tabelle sollten natürlich natürliche Primärschlüssel sein.

Eine Nachschlagetabelle von prime numbersist das, was mir zuerst einfällt.

Quassnoi
quelle
3
+1: Die Tabelle besteht aus einer Reihe von Werten, die zufällig primitive Typen Ihres RDBMS sind.
S.Lott
4
+1 für die Antwort basierend auf der relationalen Theorie.
Lubos Hasko
Hier ist ein gutes Beispiel für ein Schema, das eine 1-Spalten-Tabelle hat, die kein natürlicher Schlüssel ist, die Thread-Tabelle in einem Nachrichtensystem ... stackoverflow.com/a/6542556/45767
JeremyWeir
29

Ich habe sie in der Vergangenheit benutzt. Ein Kunde von mir wollte jeden automatisch blockieren, der versucht, sich mit einer Telefonnummer in dieser großen Liste anzumelden, also war es nur eine große schwarze Liste.

Spencer Ruport
quelle
19

Wenn es einen gültigen Bedarf dafür gibt, sehe ich kein Problem. Vielleicht möchten Sie nur eine Liste von Möglichkeiten, die aus irgendeinem Grund angezeigt werden sollen, und Sie möchten sie dynamisch ändern können, müssen sie jedoch nicht mit einer anderen Tabelle verknüpfen.

Kevin
quelle
+1 - Fazit, das ist die richtige Antwort in meinem Buch
Mark Brittingham
+1 für eine präzise und klare Antwort.
Matthew Jones
3
Warum kann eine einspaltige Tabelle nicht mit einer anderen Tabelle verknüpft werden?
Aheho
2
Warum nicht? Nehmen Sie als Beispiel die Statuscodetabelle. Warum würden Sie das nicht als Foriegn-Key-Einschränkung für eine andere Tabelle mit Adressfeldern verwenden?
Aheho
1
Das ist ein großartiges Beispiel für eine Zeit, in der es eine gute Idee wäre.
Kevin
11

Ein Fall, den ich manchmal gefunden habe, ist ungefähr so:

Die Tabelle country_id enthält nur eine Spalte mit der numerischen ID für jedes Land.

Die Tabelle country_description enthält die Spalte mit der Länder-ID, eine Spalte mit der Sprach-ID und eine Spalte mit dem lokalisierten Ländernamen.

Die Tabelle company_factories enthält Informationen zu jeder Fabrik des Unternehmens, einschließlich des Landes, in dem sich das Unternehmen befindet.

Um die Datenkohärenz und sprachunabhängige Daten in den Tabellen aufrechtzuerhalten, verwendet die Datenbank dieses Schema mit Tabellen mit nur einer Spalte, um Fremdschlüssel ohne Sprachabhängigkeiten zuzulassen.

In diesem Fall halte ich die Existenz einer Spaltentabelle für gerechtfertigt.

Herausgegeben in Reaktion auf den Kommentar von: Quassnoi


(Quelle: ggpht.com )

In diesem Schema kann ich einen Fremdschlüssel in der Tabelle company_factories definieren, für den ich keine Spalte Sprache in die Tabelle aufnehmen muss. Wenn ich jedoch nicht die Tabelle country_id habe, muss ich die Spalte Sprache in die Tabelle aufnehmen, um den Fremdschlüssel zu definieren .

Doliveras
quelle
2
Warum Länder_ID haben? Um ein Land einzufügen, müssen Sie seinen Namen in mindestens einer Sprache kennen. Dies führt dazu, dass in country_description eine country_id angezeigt wird. Eine country_id ohne country_description-Eintrag ist bedeutungslos. "Herr Barack Obama, Präsident von COALESCE (14243, country_name) RETURNED NULL VALUE, traf sich heute mit Dmitry Medvedev, Präsident von Россия"
Quassnoi
4
@ Doliveras: OK, ich sehe jetzt +1. Ich würde jedoch lieber ISO 3166-1 für coutry_code verwenden. Im Gegensatz zur numerischen ID gibt ein dreistelliger Ländercode fast jedem auf der Welt, der das lateinische Alphabet lesen kann, eine Vorstellung davon, welches Land erwähnt wird.
Quassnoi
Hier ist eine andere Möglichkeit, die ich implementiert habe, um Übersetzungen in natürlicher Sprache in derselben Tabelle unterzubringen. Zugegeben, viele Felder können daher auf Null gesetzt werden, aber Sie können die Datenintegrität auf benutzerdefinierte Trigger verlagern. 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

Es gibt seltene Fälle, in denen eine einspaltige Tabelle sinnvoll ist. Ich habe eine Datenbank erstellt, in der die Liste der gültigen Sprachcodes eine einspaltige Tabelle war, die als Fremdschlüssel verwendet wurde. Es hatte keinen Sinn, einen anderen Schlüssel zu haben, da der Code selbst der Schlüssel war. Und es gab keine feste Beschreibung, da die Sprachcodebeschreibungen für einige Kontexte je nach Sprache variieren würden.

Im Allgemeinen ist jeder Fall, in dem Sie eine maßgebliche Liste von Werten benötigen, die keine zusätzlichen Attribute aufweisen, ein guter Kandidat für eine einspaltige Tabelle.

Jeremy Bourque
quelle
5

Ich verwende ständig einspaltige Tabellen - natürlich abhängig davon, ob das App-Design bereits eine Datenbank verwendet. Nachdem ich den Entwurfsaufwand für das Herstellen einer Datenbankverbindung überstanden habe, füge ich nach Möglichkeit alle veränderlichen Daten in Tabellen ein.

Ich kann mir zwei Verwendungen von einspaltigen Tabellen OTMH vorstellen:

1) Datenelement vorhanden. Wird häufig in Dropdown-Listen verwendet. Wird auch für einfache Legitimitätstests verwendet.

Z.B. Abkürzungen für US-Bundesstaaten mit zwei Buchstaben; Postleitzahlen, an die wir versenden; Wörter legal in Scrabble; etc.

2) Sparse-Binärattribut, dh in einer großen Tabelle ein Binärattribut, das nur für sehr wenige Datensätze gilt. Anstatt eine neue boolesche Spalte hinzuzufügen, könnte ich eine separate Tabelle erstellen, die die Schlüssel der Datensätze enthält, für die das Attribut wahr ist.

Z.B. Mitarbeiter mit einer unheilbaren Krankheit; Banken mit einem 360-Tage-Jahr (die meisten nutzen 365); etc.

-Al.

AI Breveleri
quelle
4

Kein Problem, solange es eindeutige Werte enthält.

Agnel Kurian
quelle
4

Meistens habe ich dies in Nachschlagetabellen wie der von Ihnen beschriebenen Statustabelle gesehen. Wenn Sie dies jedoch tun, müssen Sie die Spalte als Primärschlüssel festlegen, um die Eindeutigkeit zu erzwingen. Wenn Sie diesen Wert nicht als eindeutig festlegen können, sollten Sie keine einzige Spalte verwenden.

HLGEM
quelle
Während die Verwendung einer einzelnen Spalte hier wahrscheinlich in Ordnung ist, sollten Sie berücksichtigen, dass Sie Eindeutigkeitsbeschränkungen auch für andere Spalten festlegen können.
Stealth Rabbi
2

Ich würde generell ja sagen. Ich bin mir nicht sicher, warum Sie nur eine Spalte benötigen. Es gibt einige Ausnahmen, die ich effektiv gesehen habe. Es hängt davon ab, was Sie erreichen wollen.

Sie sind kein wirklich gutes Design, wenn Sie an das Schema der Datenbank denken, sondern sollten eigentlich nur als Hilfstabellen verwendet werden.

Ich habe in der Vergangenheit Zahlentabellen gesehen , die effektiv verwendet wurden.

Brendan Enrick
quelle
1

Der Zweck einer Datenbank besteht darin, Informationen miteinander in Beziehung zu setzen. Wie können Sie das tun, wenn es keine Daten gibt, auf die Sie sich beziehen können?

Vielleicht ist dies eine Art Zusammenstellungstabelle (dh Vorname + Nachname + Geburtsdatum), obwohl ich mir immer noch nicht sicher bin, warum Sie das tun möchten.

EDIT: Ich konnte sehen, wie diese Art von Tabelle für eine einfache Liste verwendet wurde. Verwenden Sie es dafür?

Matthew Jones
quelle
9
Nein, der Hauptzweck einer Datenbank ist das Speichern von Informationen.
Spencer Ruport
In einer Tabelle können jedoch Informationen gespeichert werden. Und wie sind die Informationen nützlich, wenn es sich nur um eine Reihe nicht zusammenhängender Zahlen und Buchstaben handelt, zwischen denen keine Korrelation besteht?
Matthew Jones
Die Informationen können nützlich sein, da die Anwendung, die die Datenbank verwendet, sie benötigt und es sich nicht um einen festen Satz handelt. Das heißt, die Datenbank ist einfach der bequemste Ort, um Informationen für eine Datenbank-App bereitzustellen - relational oder auf andere Weise. Ich bin mir ziemlich sicher, dass Sie zustimmen würden, dass wir keine Apps erstellen, um unsere Reinheit in Bezug auf das relationale Ideal zu beweisen. Stattdessen erstellen wir Apps, die nützlich sind.
Mark Brittingham
@ Mark - Das habe ich mit einer einfachen Liste gemeint. Ich schätze, ich habe mich nicht sehr gut erklärt.
Matthew Jones
1
@SR - Nein, der Hauptzweck einer Datenbank ist das Abrufen von Informationen. Da die interessierenden Zeilen häufig von anderen Daten abhängen, denke ich, dass MJs ursprünglicher Kommentar steht.
CurtainDog
1

Ja, solange das Feld der Primärschlüssel ist, wie Sie es angekündigt haben. Der Grund dafür ist, dass beim Einfügen doppelter Daten diese Zeilen schreibgeschützt sind. Wenn Sie versuchen, eine der duplizierten Zeilen zu löschen. Es funktioniert nicht, da der Server nicht weiß, welche Zeile gelöscht werden soll.

Eric
quelle
2
Das ist lächerlich. Ein Löschvorgang ohne Primärschlüssel oder Einschränkung löscht alle übereinstimmenden Zeilen und ignoriert sie nicht.
Erik Funkenbusch
1
Mit "nicht arbeiten" könnte er "nicht wie erwartet arbeiten" meinen, was den Zustand "Hey, ich habe eine Zeile gelöscht, aber beide sind weg" abdeckt.
GWLlosa
Wenn Sie versuchen, einen Datensatz in SSMS aus der Ansicht "Tabelle öffnen" zu löschen, wird tatsächlich ein Dialogfeld angezeigt, in dem der Datensatz nicht eindeutig identifiziert werden kann, und es wird nichts unternommen ...
Michael Fredrickson
-1

Der einzige Anwendungsfall, den ich mir vorstellen kann, ist eine Worttabelle, vielleicht für ein Wortspiel. Sie greifen auf die Tabelle zu, um zu überprüfen, ob eine Zeichenfolge ein Wort ist: Wählen Sie ein Wort aus Wörtern aus, bei denen word = ?. Es gibt jedoch weitaus bessere Datenstrukturen für das Halten einer Liste von Wörtern als a relationale Datenbank.

Andernfalls werden Daten in einer Datenbank normalerweise in einer Datenbank abgelegt, um die Beziehungen zwischen verschiedenen Attributen der Daten zu nutzen. Wenn Ihre Daten keine Attribute haben, die über ihren Wert hinausgehen, wie werden diese Beziehungen entwickelt?

Obwohl dies nicht illegal ist, sollten Sie im Allgemeinen wahrscheinlich keine Tabelle mit nur einer Spalte haben.

jmucchiello
quelle
Ähnlich ist die Zahlentabelle, die sehr praktisch ist, um das Schleifen zu stoppen.
u07ch
-1

Alle meine Tabellen haben mindestens vier Technologiefelder, einen seriellen Primärschlüssel, Zeitstempel für die Erstellung und Änderung sowie einen Booleschen Wert für das weiche Löschen. In jeder schwarzen Liste möchten Sie auch wissen, wer den Eintrag hinzugefügt hat. Für mich lautet die Antwort "Nein". Eine Tabelle mit nur einer Spalte wäre nur dann sinnvoll, wenn ein Prototyp erstellt wird.


quelle
1
Es hört sich so an, als würden Sie eine Datentabelle mit einer Transaktionstabelle verwechseln. Meiner Meinung nach sollten dies zwei getrennte Dinge sein.
Josh Noe
-2

Ja das ist vollkommen in Ordnung. aber ein ID-Feld konnte es nicht verletzen, oder?

Eric
quelle
7
Eigentlich kann es. Wenn Sie eine endgültige Liste gültiger Werte haben, möchten Sie als letztes ein ID-Feld, da dies impliziert, dass die Werte nicht eindeutig sind. Wenn 'LightBlue' ein Schlüssel ist, möchten Sie nicht, dass jemand denkt, dass 'LightBlue' mit ID 1 sich von 'LightBlue' mit ID 4 unterscheidet.
Jeremy Bourque
Wer sagt, dass der Ausweis Identität sein muss? Oder ein Teil des Schlüssels?
Eric
3
Es könnte sich um einen synthetischen Schlüssel handeln, und das ursprüngliche Feld könnte eine eindeutige Einschränkung aufweisen.
Mark Canlas