2010-06-07 6 views
4

Disons que j'ai une application qui vous permet de parcourir une liste de voitures trouvées dans une base de données Sqlite. Lorsque vous cliquez sur une voiture dans la liste, cela ouvre une vue avec la description de la voiture et une photo de la voiture.Le meilleur moyen de regrouper des photos avec l'application: fichiers ou dans la base de données sqlite?

Ma question est: dois-je garder la photo dans la base de données comme une colonne de données binaires dans la rangée pour cette voiture spécifique, ou devrais-je avoir la photo quelque part dans le répertoire des ressources? Lequel est le mieux à faire? Existe-t-il des limitations de Sqlite en termes de taille d'une colonne de données binaires?

La base de données sera à peu près en lecture seule et livrée avec l'application (donc l'utilisateur n'insèrera aucune voiture et ses photos).

Répondre

0

Le default MAX SQLite size pour un BLOB ou une chaîne est 2 -1 octets. Cette valeur s'applique également aux octets maximum à stocker dans une ROW.

En ce qui concerne la méthode est meilleure, je ne sais pas. Ce que je ferais dans votre cas est de tester les deux méthodes et de surveiller l'utilisation de la mémoire et son effet sur la durée de vie de la batterie. Peut-être que vous trouverez que la méthode du système de fichiers a un net avantage sur l'autre et que la facilité de stockage dans SQLite n'en vaut pas la peine pour votre cas d'utilisation, ou peut-être que vous trouverez le contraire.

+0

Notez également que la base de données sqlite est stockée en tant que fichier unique; vous pourriez rencontrer des limitations de système de fichiers (par exemple, la fameuse limite de taille de fichier de 4 Go sur FAT32). Juste quelque chose à garder à l'esprit si vous prévoyez de distribuer l'application sur thumbdrives ou quelque chose. – Piskvor

4

C'est une décision dont on parle beaucoup. Et à mon avis, c'est une question de goût personnel. Assez comme vim/emacs, genre de débats Windows/Linux. Pas si chauffé.

Les deux côtés ont leurs avantages et leurs inconvénients. Lorsque vous les stockez dans une base de données, vous n'avez pas besoin de vous soucier du nom de fichier et de l'emplacement. La gestion est également plus facile (vous supprimez la ou les lignes contenant les BLOB, et c'est tout). Mais les fichiers sont également plus difficiles d'accès et vous avez besoin d'écrire du code wrapper d'une manière ou d'une autre (par exemple certains de ces liens "download.php"). D'autre part, si les données binaires sont stockées dans un fichier séparé, la gestion est plus compliquée (vous devez d'abord ouvrir le fichier approprié à partir du disque en construisant le nom de fichier). Sur les grands ensembles de données, vous pouvez rencontrer des goulets d'étranglement du système de fichiers lorsque le nombre de fichiers dans un répertoire devient très important (mais cela peut être évité en créant facilement des sous-répertoires). Mais alors, si les données sont stockées en tant que fichiers, les remplacer devient tellement plus facile. D'autres personnes peuvent également y accéder sans avoir besoin de connaître les internes (imaginez par exemple un utilisateur qui s'amuse à personnaliser son interface utilisateur).

Je suis certain qu'il ya d'autres points à soulever, mais je ne veux pas écrire trop maintenant ...

Je dirais: Pensez à ce que les opérations que vous voulez faire avec le photos (et les limites des deux méthodes de stockage), et de là prendre une décision éclairée. Il n'y a pas grand-chose qui puisse mal tourner.

TX-Log et FS-Journal

sur une enquête plus approfondie que je trouve un peu plus d'informations:

  • SQLite utilise un journal des transactions
  • Android utilise YAFFS points de montage sur le système et VFAT sur la Carte SD. Les deux sont (au meilleur de mes connaissances) non-publiés.

Je ne sais pas l'implémentation exacte du TX-Log de SQLite, mais il est à prévoir que chaque opération INSERT/UPDATE effectuera deux écritures sur le disque. Je peux me tromper (cela dépend en grande partie de la mise en œuvre des transactions), mais franchement, je ne pouvais pas prendre la peine de parcourir le code source de SQLite. Il me semble que nous commençons à diviser les cheveux ici (optimisation prématurée n'importe qui?) ...

Comme les deux systèmes de fichiers (YAFFS et VFAT) ne sont pas journalisés, vous n'avez aucune opération d'écriture "cachée" supplémentaire.

Ces deux points parlent en faveur du système de fichiers.

Notez que cette information doit être prise avec un grain de sel. J'ai seulement parcouru les résultats Google de YAFFS journaling et sqlite transaction log. J'ai peut-être manqué quelques détails.

+0

Merci pour votre réponse! –

+0

Si les données vont être statiques et seulement récupérables, que suggérez-vous en ce qui concerne la performance? –

+0

@CptCecil: Mon instinct me dit: Système de fichiers. Mais encore une fois, cela dépend de la situation. Beaucoup de petits fichiers, quelques uns énormes? Que fait le FS sous-jacent? Est-il journalisé? Et pour la base de données: écrit-elle dans un journal des transactions avant la consolidation des données? ... et ainsi de suite. Vous voyez, sans avoir toutes les infos, c'est difficile à dire ... – exhuma