46 votes

Base de données Meilleures pratiques pour les débutants

Donc, je suis assez nouveau programmeur de travailler vers un diplôme de premier cycle Comp Sci degré, avec une très petite quantité d'expérience de travail. Dans la recherche de stage-type d'emplois pour mon programme, j'ai remarqué que ce que j'ai entendu de plusieurs profs -- "travailler avec des bases de données constitue 90% de l'ensemble de la science moderne ordinateur emplois" -- ressemble, il est vrai. Cependant, mon programme n'a pas vraiment de cours avec des bases de données jusqu'à la 3ème année, donc j'essaye de faire au moins apprendre certaines choses moi-même dans le temps de le dire.

J'ai vu très peu sur soi et de l'internet en général, pour quelqu'un comme moi. Il semble y avoir des tonnes de tutoriels sur la façon de lire et écrire des données dans une base de données, mais peu sur les meilleures pratiques. Pour démontrer ce dont je parle, et pour aider à mettre en travers de ma réelle question, voici ce qui peut être facilement trouvé sur internet:

public static void Main ()
{
    using (var conn = new OdbcConnection())
    {
        var command = new OdbcCommand();
        command.Connection = conn;
        command.CommandText = "SELECT * FROM Customer WHERE id = 1";
        var dbAdapter = new OdbcDataAdapter();
        dbAdapter.SelectCommand = command;
        var results = new DataTable();
        dbAdapter.Fill(results);
    }

    // then you would do something like
    string customerName = (string) results.Rows[0]["name"]; 
}

Et ainsi de suite. C'est assez simple à comprendre mais, évidemment, plein de problèmes. J'ai commencé avec ce code et a rapidement commencé à dire des choses comme: "eh bien, il semble stupide d'avoir juste SQL dans tous les sens, je devrais mettre le tout dans un fichier de constantes." Et puis j'ai réalisé que c'était ridicule d'avoir ces mêmes lignes de code sur la place et vient de mettre tout ça avec des objets de connexion etc à l'intérieur d'une méthode:

public DataTable GetTableFromDB (string sql)
{
    // code similar to first sample
}    

string getCustomerSql = String.Format(Constants.SelectAllFromCustomer, customerId);
DataTable customer = GetTableFromDB(getCustomerSql);
string customerName = (string) customer.Rows[0]["name"];

Cela semblait être une grande amélioration. Maintenant, c'est super-facile, par exemple, à modifier à partir d'un OdbcConnection à un SQLiteConnection. Mais cette dernière ligne, l'accès aux données, semblait encore maladroit; et c'est toujours une douleur au changement d'un nom de champ (comme de passer de "nom" pour "CustName" ou quelque chose). J'ai commencé à lire à propos de l'aide tapé des ensembles de Données ou d'entreprise personnalisés objets. Je suis encore un peu confuse par la terminologie, mais il a décidé d'y regarder de toute façon. Je me figure que c'est stupide de s'appuyer sur un brillant Assistant de Base de données pour faire tout ça pour moi (comme dans les liens d'articles) avant de réellement savoir ce qui se passe, et pourquoi. J'ai donc pris un coup de couteau à moi-même et a commencé à faire des choses comme:

public class Customer
{
    public string Name {get; set;}
    public int Id {get; set;}

    public void Populate ()
    {
        string getCustomerSql = String.Format(Constants.SelectAllFromCustomer, this.Id);
        DataTable customer = GetTableFromDB(getCustomerSql);
        this.Name = (string) customer.Rows[0]["name"]; 
    }

    public static IEnumerable<Customer> GetAll()
    {
        foreach ( ... ) { 
            // blah blah
            yield return customer;
        }
    }
}

pour cacher le vilain tableau de trucs et de fournir certaines taper fort, permettant à l'extérieur de code pour faire des choses comme

var customer = new Customer(custId);
customer.Populate();
string customerName = customer.Name;

ce qui est vraiment agréable. Et si le Client change de table, des changements dans le code qu'il faut faire en un seul endroit: à l'intérieur de l' Customer classe.

Ainsi, à la fin de toute cette randonnée, ma question est la suivante. A ma lenteur de l'évolution de la base de données de code va dans la bonne direction? Et où dois-je aller? Ce style est très bon pour un petit-ish bases de données, mais quand il ya des tonnes de différents tableaux, l'écriture de toutes les classes pour chacun pourrait être une douleur. J'ai entendu parler d'un logiciel qui peut générer ce type de code pour vous, mais je suis encore troublé par le DAL/ORM/LINQ2SQL/etc jargon et ces énormes morceaux de logiciel sont un peu écrasante. Je suis à la recherche de quelques bonnes pas-massivement-complexe de ressources qui peut me pointer dans la bonne direction. Tout ce que je peux trouver sur ce sujet sont complexes, les articles qui vont bien au-dessus de ma tête, ou les articles que vous montrer comment utiliser le point-et-cliquez sur assistants de Visual Studio, par exemple. Notez également que je suis à la recherche d'informations sur le travail avec les Bases de données dans le code, pas d'informations sur la conception de Base de données/normalisation...il y a beaucoup de bon matériel sur que là-bas.

Merci pour la lecture de ce mur géant de texte.

19voto

Matthew Points 1655

Très bonne question, en effet, et vous êtes certainement sur la bonne voie!

Être un ingénieur en informatique, moi-même, les bases de données et comment écrire du code pour interagir avec les bases de données a également été jamais une grande partie de mon diplôme universitaire, et bien sûr, je suis responsable de tout le code de base de données au travail.

Voici mon expérience, à l'aide de la technologie analogique à partir du début des années 90 sur un projet et de la technologie moderne avec C# et WPF sur l'autre.

Je vais faire de mon mieux pour expliquer la terminologie de la je vais, mais je ne suis certainement pas un expert moi-même encore.

Des tableaux, des Objets, et des Mappages Oh Mon!

Une base de données contenant les tables, mais ce qui est vraiment? C'est juste plate données relatives à d'autres données à plat et si vous de plonger et de commencer à saisir les choses sa va dégénérer rapidement! Les chaînes seront tous sur la place, les instructions SQL répétées, les dossiers chargé à deux reprises, etc... par conséquent, Il est généralement une bonne pratique pour représenter chaque enregistrement de la table ( ou d'une collection de tableaux des dossiers en fonction de leurs relations ) comme un objet unique, généralement considéré comme un Modèle. Cela permet d'encapsuler les données et de fournir des fonctionnalités pour le maintien et la mise à jour de son état.

Dans votre message à votre Client de classe serait le Modèle!!! Si vous avez déjà réalisé cette prestation.

Maintenant il ya une variété d'outils/frameworks (LINQ2SQL, dotConnect, Mindscape LightSpeed) qui va écrire tout votre Modèle de code pour vous. Dans la fin, ils sont les objets de mappage relationnel ou de tables de mappage O/R, car ils font référence à elle.

Comme prévu lors de vos modifications de base de données afin de faire votre O/R mappages. Comme vous avez touché, si votre Client des modifications, vous devez le résoudre en un seul endroit, encore une fois pourquoi on met des choses dans les classes. Dans le cas de mon projet de l'héritage, la mise à jour des modèles consommé beaucoup de temps, car leur étaient si nombreux, alors que dans mon plus récent projet, il est, en quelques clics, MAIS en fin de compte le résultat est le même.

Qui doit savoir quoi?

Dans mes deux projets, il y a deux façons différentes de la façon dont les objets interagissent avec leurs tables.

Dans certains camps, les Modèles devraient tout savoir sur leurs tables, comment faire pour se sauver eux-mêmes, ont directement accès partagé à la connexion/session et d'effectuer des actions comme Customer.Delete() et Customer.Save() tous par eux-mêmes.

D'autres camps, mettre la lecture, l'écriture, la suppression, la logique dans la gestion de classe. Par exemple, MySessionManager.Save( myCustomer ). Cette méthodologie a l'avantage de pouvoir facilement mettre en œuvre le suivi des modifications sur les objets et assurer tous les objets font référence à la même sous-jacent de l'enregistrement de la table. La mise en œuvre, il est cependant plus complexe que le précédent mention de la méthode de localisation de classe/table de logique.

Conclusion

Vous êtes sur la bonne voie et à mon avis, en interaction avec des bases de données est extrêmement enrichissant. Je me souviens de ma tête qui tourne quand j'ai commencé à faire des recherches moi-même.

Je voudrais vous recommandons de tester un peu, commencer un petit projet peut-être un simple système de facturation, et essayez d'écrire les modèles vous-même. Après cela, essayez un autre petit projet et d'essayer de profiter d'une base de données de mappage O/R de l'outil et de voir la différence.

8voto

Corbin March Points 18522

Votre évolution est certainement dans la bonne direction. Un peu plus de choses à prendre en compte:

3voto

direct00 Points 194

Mon conseil si vous voulez vous renseigner sur les bases de données, la première étape est d'oublier le langage de programmation, à côté, oublier la base de données que vous utilisez et apprendre le SQL. Sûr qu'il y a de nombreuses différences entre mySQL, MS sql server et Oracle, mais il ya tellement de choses qui est le même.

Apprendre sur les jointures, sélectionnez les formats de date, le processus de normalisation. Savoir ce qui se passe quand vous avez des millions et des millions de documents et les choses commencent à ralentir, puis apprendre à le réparer.

Créer un projet de test lié à quelque chose qui vous intéresse, par exemple, un magasin de vélo. Voir ce qui se passe lorsque vous ajoutez un peu de millions de produits, et quelques millions de clients et de penser à toutes les façons dont les données se rapportent.

Utiliser une application de bureau pour l'exécution de requêtes sur une base de données locale (suite pro, mysql workbench, etc) car il est beaucoup plus rapide que de télécharger le code source à un serveur. Et avoir du plaisir avec elle!

2voto

Cory Points 37551

Si vous êtes un peu peur de choses comme Linq to SQL et Entity Framework, vous pouvez l'étape de la moitié du chemin entre les deux et d'explorer quelque chose comme iBATIS.NET. C'est tout simplement un mappeur de données outil qui prend une partie de la douleur de la connexion à la base de la gestion et de la cartographie de vos ensembles de résultats à des objets de domaine personnalisé.

Vous devez écrire tous vos classes d'objet et SQL, mais il cartes de l'ensemble de vos données pour les classes à l'aide de la réflexion, et vous n'avez pas à vous soucier de tous les sous-jacents de la connectivité (vous pouvez facilement écrire un outil pour générer des classes). Lorsque vous êtes en cours d'exécution avec iBATIS (en supposant que vous pourriez être intéressé), votre code va commencer à ressembler à ceci:

var customer = Helpers.Customers.SelectByCustomerID(1);

Qu' SelectByCustomerID fonction existe à l'intérieur de l' Customers mappeur, dont la définition pourrait ressembler à:

public Customer SelectByCustomerID(int id)
{
    Return Mapper.QueryForObject<Customer>("Customers.SelectByID", id);
}

De La "Les Clients.SelectByID" correspond à une instruction XML de définition où "Clients" est l'espace de noms et "SelectByID" est l'ID de la carte contenant votre SQL:

<statements>
    <select id="SelectByID" parameterClass="int" resultClass="Customer">
        SELECT * FROM Customers WHERE ID = #value#
    </select>
</statements>

Ou lorsque vous souhaitez modifier un client, vous pouvez faire des choses comme:

customer.FirstName = "George"
customer.LastName = "Costanza"

Helpers.Customers.Update(customer);

LINQ to SQL et Entity Framework obtenir de l'amateur, par la production de SQL automatiquement pour vous. J'aime iBATIS parce que j'ai encore plein contrôle du SQL et de ce que mes objets de domaine ressembler.

Découvrez iBATIS (maintenant migré vers Google sous le nom de MyBatis.NET). Un autre grand paquet est NHibernate, ce qui est un peu en avance de iBATIS et de plus pour un plein de l'ORM.

2voto

Tom Carver Points 507

À mon humble avis, vous n'êtes certainement va dans la bonne direction pour vraiment agréable de travailler avec maintenable code! Cependant, je ne suis pas convaincu que l'approche de mise à l'échelle pour une application réelle. Quelques idées qui peuvent être utiles

  1. Alors que le code que vous avez écrit est vraiment agréable de travailler avec et vraiment facile à gérer, il implique beaucoup de travail à l'avant, c'est en partie la raison pour laquelle les assistants sont si populaires. Ils ne sont;t la chose la plus sympa de travailler avec, mais d'économiser beaucoup de temps.
  2. L'interrogation de la base de données n'est que le début; une autre raison pour l'utilisation de datasets typés et des assistants en général, c'est que dans la plupart des applications, les utilisateurs sont à un stade va modifier vos informations et de les envoyer en arrière pour la mise à jour. Seul les dossiers sont très bien, mais que si vos données sont mieux représentés dans Normalisé avec une hiérarchie de tables de 4 de profondeur? L'écriture de code pour générer automatiquement la mise à jour/insert/delete par la main pour tout ce que l'appel soit infernal, si les outils sont la seule façon d'avancer. typés va générer tout le code pour effectuer ces mises à jour pour vous et certains très puissantes fonctionnalités pour la manipulation déconnecté (par exemple, côté Client) les mises à jour/annulations de modifications récentes.
  3. Ce que le dernier gars dit à propos de l'injection SQL (ce qui est une très grosse affaire dans l'industrie) et de vous protéger à l'aide d'un DBCommand objet et l'ajout de DbParameters.

En général, il y a vraiment un gros problème en passant de code pour les bases de données de référence comme une adaptation d'impédance. Combler le fossé est très délicate et c'est pourquoi la majorité de l'industrie s'appuie sur les outils pour faire le gros du travail. Mon conseil serait d'essayer les assistants - " parce que en passant par un assistant n'est pas un critère de compétence, l'apprentissage de tous leurs défauts/bugs et de leurs diverses solutions de contournement est vraiment une compétence utile dans l'industrie, et vous permettra d'obtenir quelques-uns des scénarios plus avancés dans la gestion des données plus rapidement (par exemple, l'déconnecté de mise à jour d'un 4-profondeur de la table de hiérarchie je l'ai mentionné).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X