Si j'ai plusieurs types d'objet, quand object.type doit-il être une chaîne et quand doit-il être une clé étrangère?

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

Question

Disons que j'ai des livres qui peuvent être romans, fictions ou mystères. J'ai 2 options réalistes pour stocker ces données. L'une consiste à avoir une colonne de type dans la table des livres qui est une chaîne avec la valeur "romance", "fiction" ou "mystère". L'autre consiste à créer une table book_types et à y stocker les types. Ensuite, mes livres auraient une clé étrangère type_id faisant référence à la table book_types.

Ma question est la suivante: comment choisir le meilleur? J'ai vu la méthode de chaîne utilisée dans le plug-in Restful authentication Rails qui contient des informations sur l'état des utilisateurs: "inactif", "actif", "en attente" ...

Existe-t-il un problème de performance lié à l'utilisation de la méthode de la table de consultation, dans la mesure où j'interrogerai ces informations tout le temps?

Merci!

Était-ce utile?

La solution

L’approche par clé étrangère donnera de meilleurs résultats. La comparaison des chaînes ralentira les choses. Comparer les chiffres est beaucoup plus rapide.

Si vous souhaitez accélérer encore davantage les requêtes, ajoutez un index sur la colonne que vous utilisez pour référencer la clé étrangère. Contrairement aux clés primaires, les index ne sont pas automatiquement créés pour les clés étrangères.

Autres conseils

s'il n'y a jamais plus d'informations à stocker contre quelque chose, string est normalement bon (bien qu'il s'agisse d'une valeur non transitoire, elle n'est donc pas sous forme normale).

Cela semble être un bon candidat pour une table, cependant, vous voudrez peut-être en faire plus avec les catégories et ce devrait donc être une table de référence, imo.

Dans la plupart des cas, l’approche avec une clé étrangère vers une table séparée est préférable - avantages:

  • La table séparée vous donne un manière extensible de valider l'entrée. Insertion d'une contrainte de vérification codée en dur dans la définition de la table nécessite ensuite un ALTER TABLE pour ajouter un nouveau type

  • Si vous devez modifier le texte du texte pour une raison quelconque (par exemple, "romance" - > "fiction pour femmes", par exemple), vous ne disposez que d'une mise à jour légère du tableau de recherche. .

  • Vous pouvez éventuellement avoir des types pour lesquels il n'y a pas encore d'entrées et la table séparée vous permet d'utiliser une jointure externe pour inclure le type dans les ensembles de résultats SQL.

  • Du point de vue de l'interface, un tableau séparé vous permet de générer facilement une liste déroulante de types ne nécessitant pas de codage en dur dans l'interface utilisateur.

En ce qui concerne les performances, avec le bon index sur le FK, tout moteur de SGBDR sera performant - les jointures sont l’objet du système de SGBDR.

Je voudrais utiliser fk. Moins d'informations dupliquées.

EDIT: Meilleure solution: Code MySql:

CREATE TABLE books
(
    id int AUTO_INCREMENT          not null,
    book_type enum('romance', 'fiction', 'mystery')     not null,
    ....
);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top