Wenn ich mehrere Arten eines Objekts haben, wann sollte object.type eine Zeichenfolge sein, und wann sollte es ein Fremdschlüssel sein?

StackOverflow https://stackoverflow.com/questions/1005384

Frage

Lassen Sie uns sagen, dass ich Bücher haben, die Romantik sein kann, Fiktion oder Rätsel. Ich habe 2 realistische Optionen, um diese Daten zu speichern. Eine davon ist eine Art Spalte in meinen Büchern Tabelle zu haben, die eine Zeichenfolge mit dem Wert „Romantik“ ist, „Fiktion“ oder „Geheimnis“. Die andere ist eine book_types Tabelle zu erstellen, und die Typen speichern dort. Dann hätten meine Bücher einen type_id Fremdschlüssel Referenzierung die book_types Tabelle.

Meine Frage ist, wie kann ich wählen, welche ist am besten? Ich habe die String-Methode in der Restful Authentifizierung Rails-Plugin verwendet gesehen, die Informationen über den Benutzer Zustand enthält - ‚inaktiv‘, ‚aktiv‘, ‚offen‘ ...

Gibt es einen Leistungseinbruch der Lookup-Tabelle Methode unter Berücksichtigung für die Verwendung werde ich für diese Informationen die ganze Zeit abfragt?

Danke!

War es hilfreich?

Lösung

Der Fremdschlüssel Ansatz wird eine bessere Leistung. String-Vergleich wird die Dinge verlangsamen. Es ist viel schneller zu Zahlen vergleichen.

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

Andere Tipps

, wenn es nie mehr gegen etwas gespeichert werden, string ist in der Regel in Ordnung (obwohl dies ein nicht-vorübergehender Wert ist, so dass es nicht normal-Form ist).

Dies scheint ein guter Kandidat für eine Tabelle, aber so dass Sie mehr mit Kategorien tun möchten, so dass es eine Referenztabelle sein sollte, imo.

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 ein erweiterbarer Weg, um die Eingabe zu bestätigen. Putting eine hartcodierte Check-Bedingung in der Tabellendefinition dann erfordert eine ALTER TABLE ein hinzufügen neue Art

  • Wenn Sie jemals den Typen Text aus irgendeinem Grunde (zum Beispiel „Romantik“ -> „Frauen Fiktion“ für ein lahmes Beispiel) ändern müssen, werden Sie nur ein leichtes Update auf die Lookup-Tabelle haben.

  • Sie könnten möglicherweise Typen haben, für die es keine Einträge vorhanden und die separate Tabelle können Sie verwenden einen äußeren den Typ in SQL Ergebnismengen enthalten beizutreten.

  • Von der Schnittstelle Perspektive, eine separate Tabelle läßt erzeugen Sie leicht eine Dropdown-Liste von Typen, die nicht hart Codierung in der Benutzeroberfläche erforderlich ist.

Was die Leistung geht, mit dem richtigen Index für die FK wird jede RDBMS-Engine eine gute Leistung - verbindet, was ein RDBMS für ist so konzipiert,

.

Ich würde fk verwenden. Weniger Informationen dupliziert werden.

EDIT: Betther Lösung: MySql Code:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top