Question

Dans ma demande, je voudrais l'utilisateur de sélectionner ses jours ouvrables. puis les stocker dans la base de données. Bien sûr, mon application traitera les données des utilisateurs comme:. Est-ce aujourd'hui une journée de travail pour un utilisateur spécifique, qui sont les utilisateurs qui devraient fonctionner aujourd'hui, ... etc

Ma question est, quelle est la meilleure pratique pour ce faire? Utilisez au I:

  1. champ Bitmasking dans la table des utilisateurs
  2. Beaucoup de nombreuses tables de relations en créant une table pour les jours, les utilisateurs et days_users. Nous vous remercions à l'avance.
Était-ce utile?

La solution

Je dirais que les champs de masque de bits sont un anti-modèle relationnel.

A champ doit avoir une seule valeur significative, sinon vous vous retrouvez avec des problèmes - interrogation. Parsing le terrain chaque fois que vous devez utiliser requête

Un tel champ nécessite également une documentation supplémentaire, car les valeurs qu'il stocke ne sont pas auto décrire.

Autres conseils

champ Bitmasking est un peu plus cryptique dans la nature et vous avez besoin de créer quelque chose d'autre pour interpréter ce que vous amassez dans le bitmask.

La seconde approche est beaucoup plus transparente et facilement compréhensible et il est un peu plus souple si vous avez besoin d'ajouter d'autres valeurs. Avec le bitmask, vous devez à nouveau refaire chaque fois que votre décodeur bitmap vous ajoutez une valeur qui peut être un cauchemar par rapport à l'maintainance approche relationnelle.

J'ai fait l'erreur d'aller avec l'option 1, et la possibilité de remonter dans le temps, je absolument le faire dans l'autre sens.

Votre base de données presque certainement pas utiliser un index pour faire des requêtes sur votre bitmask au niveau du bit. Donc, si vous voulez trouver, dire, tout le monde mardi travail, vous allez faire un parcours d'index à chaque fois. Comme vos tables sont grandes, cela peut détruire votre performance. Vous pouvez essayer d'optimiser contourner ce problème en mettant en cache un SELECT DISTINCT(bitmaskfield) à l'avance, en faisant la logique de bitmask dans votre propre application, et turing dans une clause WHERE bitmaskfield IN (...) appropriée, mais devient rapidement ingérable que vous avez alors de mettre à jour votre cache distincte-bitmask dans tous les lieux que vous modifiez les valeurs dans la base de données.

Les tables supplémentaires et jointures peuvent sembler comme une douleur, mais le bitmask se révélera pire. Croyez-moi sur ce point. Utilisez votre base de données comme base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top