2

Nehmen wir an, ich habe Bücher, die Romantik, Fiktion oder Geheimnis sein können. Ich habe 2 realistische Optionen, um diese Daten zu speichern. Eine besteht darin, eine Typspalte in meiner Büchertabelle zu haben, die eine Zeichenfolge mit dem Wert "Romantik", "Fiktion" oder "Geheimnis" ist. Die andere besteht darin, eine Tabelle book_types zu erstellen und die Typen dort zu speichern. Dann würden meine Bücher einen Fremdschlüssel type_id haben, der auf die Tabelle book_types verweist.Wenn ich mehrere Typen eines Objekts habe, wann sollte object.type eine Zeichenfolge sein und wann sollte es ein Fremdschlüssel sein?

Meine Frage ist, wie wähle ich, welches ist das Beste? Ich habe die String-Methode im Restful-Authentifizierungs-Rails-Plugin gesehen, die Informationen über den Benutzerstatus enthält - "inaktiv", "aktiv", "ausstehend" ...

Gibt es einen Leistungseinbruch für die Verwendung der Nachschlagetabelle-Methode Wenn ich bedenke, dass ich ständig nach diesen Informationen fragen werde?

Danke!

Antwort

3

Der Fremdschlüssel Ansatz besser abschneiden wird. Stringvergleich wird die Dinge verlangsamen. Es ist viel schneller, Zahlen zu vergleichen.

Wenn Sie Abfragen noch mehr beschleunigen möchten, fügen Sie einen Index für die Spalte hinzu, die Sie verwenden, um auf den Fremdschlüssel zu verweisen. Im Gegensatz zu Primärschlüsseln werden Indizes für Fremdschlüssel nicht automatisch erstellt.

1

Wenn es nie mehr Informationen gibt, die gegen etwas gespeichert werden, ist der String normalerweise in Ordnung (obwohl dies ein nicht-flüchtiger Wert ist, also keine normale Form).

Dies scheint jedoch ein guter Kandidat für eine Tabelle zu sein, also möchten Sie vielleicht mehr mit Kategorien machen, also sollte es eine Referenztabelle sein, imo.

0

Ich würde fk verwenden. Weniger Informationen dupliziert.

EDIT: betther Lösung: MySql Code:

CREATE TABLE books 
(
    id int AUTO_INCREMENT   not null, 
    book_type enum('romance', 'fiction', 'mystery')  not null, 
    .... 
); 
+0

Nicht alle Datenbanken haben den Enum-Typ.Und ist es so einfach, neue Kategorien hinzuzufügen? – UncleO

+1

@uncleo: Deshalb habe ich "mysql code" geschrieben. Über das Hinzufügen neuer Kategorien: Offensichtlich hängt die richtige Lösung davon ab, was er braucht. Wenn book_type nicht ändern wird, enum ist es in Ordnung. – Macarse

+0

Ich meinte es als eine berechtigte Frage. Ich habe noch nie enum benutzt. Ich habe mich gefragt, was passieren würde, wenn die Spalte zu einem anderen Enum geändert würde. Würde es die alten Werte korrekt beibehalten, wenn am Ende ein neuer Wert hinzugefügt wurde? – UncleO

1

In den meisten Fällen wird der Ansatz mit einem Fremdschlüssel zu einer separaten Tabelle ist am besten - Vorteile:

  • Die separate Tabelle gibt Ihnen einen erweiterbarere gibt den Eintrag zu bestätigen. eine hartcodierte Check-Einschränkung in der Tabellendefinition Putting erfordert dann eine ALTER TABLE einen neuen Typ

  • Wenn Sie jemals den Typ Text aus irgendeinem Grund (zB „Romantik“ ändern müssen hinzufügen -> „Frauen fiction "Für ein lahmes Beispiel), haben Sie nur ein leichtes Update für die Nachschlagetabelle.

  • Es könnte denkbar sein, dass es Typen gibt, für die noch keine Einträge vorhanden sind, und in der separaten Tabelle können Sie einen äußeren Join verwenden, um den Typ in SQL-Ergebnismengen aufzunehmen.

  • Aus der Perspektive der Benutzeroberfläche können Sie in einer separaten Tabelle auf einfache Weise eine Dropdown-Liste mit Typen erstellen, die in der Benutzeroberfläche nicht hart codiert werden müssen.

Soweit die Leistung, mit der richtigen Index für die FK geht jeder RDBMS Motor gut durchführen wird - schließt sich, was ein RDBMS ausgelegt ist.