11
votes

MongoDB C # Pilote officiel: Mappage d'objets à des noms abrégés pour limiter l'espace

Je cherche un moyen de cartographier les objets BSON définis à l'aide de noms lisibles ("catégorie") pour abréger les noms ("CT") et limiter l'espace occupé par les noms d'éléments dans la base principale du document. J'ai vu cela en utilisant d'autres pilotes, mais qu'en est-il de l'utilisation de pilote officiel. Comment puis-je faire, où est le meilleur endroit pour définir. Peut utiliser des noms longs dans les requêtes et récupérer des courts contenus ?.

merci.


2 commentaires

Heh, vous feriez mieux d'espérer que vous n'aurez jamais à passer par la base de données. "Hmm Je pense dans 90% des cas c'est une optimisation prématurée


Je pense que si vous avez un enregistrement des noms que vous avez créés pour les champs de votre base de données stockés quelque part sûr, vous êtes d'accord.


3 Réponses :


0
votes

considérer un enregistrement

{Nom_rate_: "Smith", best_score: 3.9}

Les chaînes "Nom" et "best_score" seront stockées dans le BSON de chaque objet. L'utilisation de chaînes plus courtes permettrait d'économiser de l'espace:

{LNAME: "Smith", Score: 3.9}

permettrait d'économiser 9 octets par document. Cela réduit bien sûr l'expressivité au programmeur et n'est pas recommandé, sauf si vous avez une collection où cela est d'une préoccupation importante.

Les noms de champs ne sont pas stockés dans des index car les index ont une structure prédéfinie. Ainsi, les noms de champs de raccourcissement ne contribueront pas à la taille des index. En général, il n'est pas nécessaire d'utiliser des noms de champ courts.

Vérifiez Source pour plus de détails

Mais d'autres côtés sont décrits dans un sujet célèbre " Vous avez enregistré 5 cents et votre code n'est pas lisible, félicitations! "

et ma propre opinion que le nom abrégé est mauvais moyen.


3 commentaires

Avoir un sens mais j'utilise une collection où les noms d'articles et les sous-éléments sont toujours répétés avec les mêmes informations, les noms d'éléments ou les noms de clés. Plus de 70% sont des informations verbeuses au lieu de données de valeur. Je pense que la maçage a un vrai sens. Consultez votre stockage de données et votre bande passante qui ne sont pas gratuites.


Si je conviens que vous ne voulez pas sacrifier la lisibilité de votre code, cela ne vaut rien que ces 9 octets s'ajoutent rapidement dans certains cas. Cette réponse est une mauvaise parce qu'elle est valable pour une collection de 10 objets, il va faire mal quand traiter une collection de 10 millions. L'espace disque est bon marché, mais pas gratuit.


L'utilisation de disque n'est même pas le plus gros problème. Les grands noms diminueront la cache-câbilité des objets, à la fois dans le cache de disque RAM et dans les caches CPU. Cela diminue considérablement la performance, en particulier sur les lecteurs de disque magnétiques, même pour des jeux de données plus petits.



28
votes

Puisque personne n'a réellement donné la réponse à la question, c'est ici.

Avec le pilote officiel, vous pouvez le faire en décorant un nom de propriété avec Bosselement. Par exemple: xxx

Le pilote utilisera "DT" comme nom de propriété BSON.

Cependant, à ce moment-là, il n'y a aucun moyen d'interroger en utilisant le nom de la propriété POCO. Vous auriez besoin d'utiliser "DT" dans vos questions. Il existe un projet séparé qui est construit sur le pilote C # qui fournit des capacités de requête de style LINQ, mais je ne l'ai pas testé pour vérifier si cela fera ce que vous demandez.


2 commentaires

Tout va bien, mais toutes les questions vont fonctionner par des noms courts. Donc, vous oublierez après une heure que signifie la requête suivante: requête.et (requête.eq ("fn", filtre.field1), requête.ne ("MS", filtre)) ou quelque chose similaire à celui-ci.


D'accord .. Mais si votre collection va contenir des millions, voire des milliards de documents (par exemple pour une plate-forme d'analyse, par exemple), cela en valait la peine de garder des notes quelque part sur ce que sont vos noms de propriété.



9
votes

Il vaut mieux garder les modèles propres. Et mongodb.Driver permet de le faire à l'extérieur.

BsonClassMap.RegisterClassMap<SomeClass>(x =>
{
     x.AutoMap();
     x.GetMemberMap(m => m.SomeReallyLongDateTimePropertyName).SetElementName("dt");
});


1 commentaires

@ilans Ce code doit être appelé une seule fois, peut-être dans l'instance de configuration singleton. 'X.AutoMap ()' fait des vérifications initiales de toutes les propriétés de "Soméclass": détecte le type de données, le nom de champ, etc. et ne conserve que des paramètres. Ensuite, vous pouvez remplacer les paramètres de l'étape précédente. Dans cet exemple, "SetElementName" demande à Mongo pilote d'utiliser le nom de champ "DT 'au lieu du nom par défaut (SomereallyLongDateTeTimePropertyName).