2010-08-04 14 views
9

Ich habe eine Spalte in einer Tabelle, die einen Enum-Wert speichert. Z.B. Groß, Mittel, Klein oder die Tage der Woche. Dies entspricht dem angezeigten Text auf einer Webseite oder der Benutzerauswahl aus einer Dropdown-Liste. Was ist das beste Design?gutes Datenbankdesign: enum Werte: Ints oder Strings?

Speichern Sie die Werte als int und dann vielleicht eine Tabelle, die die enums/int entsprechende Zeichenfolge enthält.

Speichern Sie einfach die Werte in der Spalte als Zeichenfolge, um Abfragen etwas selbsterklärender zu machen.

Zu welchem ​​Punkt/Menge von Werten ist es am besten, Ints oder Strings zu verwenden.

Danke.

+0

Ein Vorteil der Verwendung von Zeichenfolgen ist, dass sie einfacher zu lesen sind, wenn Sie oder jemand anderes jemals direkt mit der Datenbank arbeiten muss. Es erspart Ihnen den Aufwand, sich den Tabellen anzuschließen, die die Ints definieren, um Abfragen lesbar zu machen. Ich habe ziemlich große Implementierungen mit Strings gesehen - die Auswirkungen auf die Performance sind vernachlässigbar. –

Antwort

0

Gehen Sie mit Ihrem ersten Beispiel. Sagen wir, Sie erstellen eine Nachschlagetabelle: Größen. Es hat die folgenden Spalten: Id - Primärschlüssel + Identität Namen - Varchar/Nvarchar

Sie würden drei Zeilen in der Tabelle haben, Small, Medium und Large mit Werten 1, 2, 3, wenn Sie sie eingefügt in diese Reihenfolge.

Wenn Sie eine andere Tabelle haben, die diese Werte verwendet, können Sie den Identity-Wert als Fremdschlüssel verwenden ... oder Sie können eine dritte Spalte erstellen, bei der es sich um einen Short-Hand-Wert für die drei Werte handelt. Es hätte die Werte S, M & L. Sie könnten das stattdessen als Fremdschlüssel verwenden. Sie müssten eine eindeutige Einschränkung für die Spalte erstellen.

Soweit das Dropdown, können Sie entweder eins als den Wert hinter den Kulissen verwenden.

Sie könnten auch S/M/L-Wert als Primärschlüssel auch erstellen.

Für Ihre andere Frage, wann es am besten ist, die Ints vs Strings zu verwenden. Über dieses Thema wird wahrscheinlich viel diskutiert. Viele Leute verwenden nur gerne Identitätswerte als primäre Schlüssel. Andere Leute sagen, dass es besser ist, einen natürlichen Schlüssel zu verwenden. Wenn Sie keine Identität als Primärschlüssel verwenden, müssen Sie nur sicherstellen, dass Sie einen guten Kandidaten für den Primärschlüssel haben (stellen Sie sicher, dass dieser immer eindeutig ist und der Wert sich nicht ändert).

2

RDBMS der Wahl Unter der Annahme, keinen ENUM-Typen hat (was dies für Sie Griffe), ich glaube, am besten IDs verwenden anstelle von Strings direkt, wenn die Werte ändern (entweder in Wert oder in der Menge.)

Sie denken vielleicht, dass sich die Wochentage nicht ändern werden, aber was ist, wenn Ihre Anwendung Internationalisierungsunterstützung hinzufügen muss? (Oder ein böser multinationaler Konzern beschließt, sie umzubenennen, nachdem er die Kontrolle über die Welt übernommen hat?)

Auch die Kategorisierung Large, Medium und Small ändert sich wahrscheinlich nach einiger Zeit. Die meisten Werte, die Sie nicht ändern können, können sich nach einer Weile ändern.

Also, hauptsächlich für die Vorwegnahme von Änderungsgründen, denke ich, es ist am besten, IDs zu verwenden, Sie müssen nur die Übersetzungstabelle ändern und alles funktioniert schmerzlos. Für i18n können Sie einfach die Übersetzungstabelle erweitern und die richtigen Datensätze automatisch ziehen.

Am wahrscheinlichsten (es hängt von verschiedenen Faktoren ab) werden die Ints besser funktionieren, zumindest in der Menge des erforderlichen Speichers. Aber ich würde aus Performance-Gründen keine Ints machen, würde ich aus Gründen der Flexibilität tun.

+0

Ist Ihnen nicht schon mal aufgefallen, welche RDBMS ENUM-Unterstützung haben? Etwas, das ich für definitiv verpasst habe –

+0

MySQL hat es: http://dev.mysql.com/doc/refman/5.0/en/enum.html –

+0

Fantastisch, ich fange gerade an, einen Blick auf mySQL zu werfen, damit ich ' Ich halte Ausschau danach. –

1

Dies ist eine interessante Frage.Auf jeden Fall müssen Sie hier Leistungsziele berücksichtigen. Wenn Sie Geschwindigkeit anstreben, ist int ein Muss. Eine Datenbank kann ganze Zahlen ein bisschen besser als Strings indizieren, obwohl ich sagen muss, dass es überhaupt keinen schlechten Performanceverlust gibt.

Ein Beispiel ist die Oracle-Datenbank selbst, wo sie den Luxus haben, Large Caps Enum als Strings auf ihren Systemtabellen zu machen. Dinge wie USER_ALLOCATION_TYPE oder solche Dinge sind die Norm. Wie du sagst, Strings können "erweiterbarer" und besser lesbar sein, aber auf jeden Fall in dem Code wirst du enden mit:

Statische letzte Zeichenkette USER_ALLOCATION_TYPE = "USER_ALLOCATION_TYPE";

anstelle von

static final int USER_ALLOCATION_TYPE = 5;

Da Sie dies entweder tun, werden Sie mit all diesen Zeichenfolgenliteralen enden, die nur für jemanden schmerzvoll sind, dorthin zu gehen und einen Buchstaben falsch zu setzen! :)

In meiner Firma verwenden wir Tabellen mit ganzen Zahlen Primärschlüssel; Alle Tische haben einen seriellen Primärschlüssel, denn selbst wenn Sie nicht glauben, dass Sie einen brauchen, werden Sie das früher oder später bereuen.

In dem Fall, den Sie beschreiben, was wir tun, haben wir eine Tabelle mit (PK Int, Beschreibung String) und dann machen wir Views über die Master-Tabellen mit Joins, um die Beschreibungen zu erhalten, auf diese Weise sehen wir die Verbundene Felder Beschreibungen, wenn wir müssen und wir halten die Leistung aufrecht.

Mit einer separaten Beschreibungstabelle können Sie EXTRA Informationen über diese IDs haben, an die Sie niemals denken würden. Nehmen wir beispielsweise an, ein Benutzer kann nur dann auf einige Felder im Kombinationsfeld zugreifen, wenn sie diese Eigenschaft haben. Sie können zusätzliche Felder in der Beschreibungstabelle verwenden, um diese anstelle von Ad-hoc-Code zu speichern.

Meine zwei Cent.

0

Ich wäre auch daran interessiert, dass Leute darüber nachdenken, ich bin immer den Weg gegangen, die Enumeration in einer Nachschlagetabelle zu speichern und dann in allen Datentabellen, die die Enumeration referenzierten, würde ich die ID speichern und eine FK-Beziehung verwenden . In gewisser Weise mag ich diesen Ansatz immer noch, aber es gibt etwas Einfaches und Einfaches, den String-Wert direkt in die Tabelle zu setzen.

Geht rein nach Größe, ein int ist 4 Bytes, wo wie die Zeichenfolge ist n btyes (wobei n die Anzahl der Zeichen ist). Der kürzeste Wert in Ihrer Suche ist 5 Zeichen, am längsten ist 6, also würde das Speichern des tatsächlichen Werts mehr Speicherplatz verbrauchen (wenn das ein Problem war).

Nach Leistung bin ich nicht sicher, ob ein Index auf einem int oder auf einem Varchar einen Unterschied in der Geschwindigkeit/Optimierung/Indexgröße zurückgeben würde?

+0

Einfach, einfach und schmerzhaft: Updates zu tun, wenn sich die Werte ändern und Ihre Daten auf einen respektablen Betrag wachsen, wird ein Schmerzen. Die Aufrechterhaltung der Konsistenz über diese Änderungen hinweg könnte ebenfalls zu einem Problem werden. Wenn Sie die Enumeration erweitern, um einen neuen Wert hinzuzufügen (wenn Sie dies erzwingen), könnte dies zu einem Schmerz werden.Und es gibt wahrscheinlich schmerzhafteres Zeug, an das ich nicht einmal denke. –