Sollte ich in der agilen Entwicklung versuchen, die Flatfile vor der Datenbank beizubehalten?


21

Jemand erklärte mir, dass in der agilen Entwicklung die Richtlinien und die Anwendungslogik wichtiger sein sollten als Details wie die Persistenzmethode, und dass die Persistenzentscheidung am Ende getroffen werden sollte. Daher ist es möglicherweise eine gute Idee, mit einer einfacheren Persistenz wie beispielsweise Einfachdateien zu beginnen, bis wir den Punkt erreicht haben, an dem die Schwäche dieser Methode offensichtlich wird, und erst dann ändern wir die Persistenz, z. B. durch Verwendung einer relationalen Datenbank.

Ist das wahr oder habe ich das Konzept falsch verstanden? Ist dies die Art und Weise, wie ein agiles Team normalerweise eine Anwendung erstellt? Was sind die Gründe dafür und wann sollte ich nicht so vorgehen?


1
Die Persistenzlogik ist nicht Teil kleinerer Details oder weniger wichtig. Das muss die erste Entscheidung sein. Sie möchten ACID-Eigenschaften für Ihre Persistenzstruktur. Diese Entscheidung kann nicht aufrechterhalten werden.
Manoj R

Antworten:


42

Das Konzept, das vermittelt wird, ist definitiv Teil von Agilität und Relevanz.

Das angeführte Beispiel basiert jedoch auf einer völlig falschen Annahme:

dass die Implementierung einer Flat-File-Datenbank einfacher ist als die Verwendung eines RDBMS. - Oft völlig falsch

Das Beispiel sollte lauten: Die Persistenzschicht wird auf die einfachstmögliche Implementierung beschränkt, bis eine Entscheidung getroffen wird, dass sie unangemessen ist.

Für viele Entwicklerteams ist es eine Frage von ein oder zwei Stunden (oder 15 Minuten für kleine Datenbanken mit ORM), ob eine Flatfile-Datenbank, mit der sie sich nicht ständig einmischen müssen, ein Problem darstellt enormer Schmerz und Ärger, weil sie den gesamten Code für Such- und Datentabellenkonstruktion manuell von Hand schreiben müssen, wenn eine Datenbank so einfach sein kann, wie eine Tabelle in einer Benutzeroberfläche zu erstellen, einige Spalten hinzuzufügen und dann von einem ORM alles generieren zu lassen sonst brauchst du.

Wenn Sie nicht wissen, dass Ihre Persistenzschicht zu Beginn vorhanden ist, ist dies eine noch geeignetere Maßnahme, um mit einem gemeinsamen RDBMS zu beginnen, das Ihr Team gut kennt, da die Änderung von Flat-File zu RDBMS später viel größer ist als später Wechsel von einem RDBMS zu einem anderen. Es gibt viele Tools für die Konvertierung von den meisten gängigen RDBMS zu anderen solchen und Tipps und solche, da es sich um einen viel befahrenen Pfad handelt. Es gibt nur sehr wenige Tools für die Konvertierung von einer Flat-File in ein bestimmtes RDBMS, bei dem Ihre Flat-File ein proprietäres Format hat, für das Tooling außer für Ihre eigenen Bibliotheken noch nicht geschrieben wurde.

Zusammenfassend: Das Konzept ist korrekt und genau, aber das Beispiel basiert auf einer furchtbar großen und oft (fast immer) ungenauen Annahme .


6
Und Ihre schrecklich große Annahme ist, dass sie den gesamten Such- und Datentabellenkonstruktionstypcode manuell von Hand schreiben müssen! :-) Wenn Sie eine Flat-Datei verwenden, verwenden Sie in der Regel zunächst das in Ihrer Sprache integrierte Serialisierungsformat (z. B. Marshal in Ruby oder NSKeyedArchiver in Cocoa / Objective-C) und geben nur einige vorhandene interne Objekte aus. Solange Ihre App nicht zu oft neu geladen werden muss und Sie die Schemaänderungen in verschiedenen App-Versionen im Griff haben, kann diese Technik besonders während der Entwicklung über einen längeren Zeitraum bemerkenswert gut funktionieren.
Alex Chaffee

@AlexChaffee fair point, aber so oder so muss man irgendeinen Code um dieses Zeug schreiben, und moderne ORMs machen solche Dinge mit einem RDBMS oder NoSQL, was in der Trivialität ziemlich gleichwertig ist, wo der Unterschied in der Auswirkung auf das Team ist Ich denke, es ist ein schlechtes Beispiel, um den Punkt zu veranschaulichen, den es aus diesem Grund versucht. Persönlich habe ich MSSQL 13 Jahre lang verwendet, aber vor Ort würde MongoDB aus Gründen der Persistenz aus dem Ruder laufen, damit es das eigentliche Ziel des Projekts nicht beeinflusst, bis es auf ACID ankommt.
Jimmy Hoffa

17

Da Sie wissen, dass Sie eine Datenbank verwenden, macht es nicht viel Sinn, Code für den Umgang mit Flatfiles zu schreiben. Sie können einige Iterationen mit schreibgeschützten CSVs durchlaufen, aber Sie werden schnell feststellen, dass Sie Code schreiben, von dem Sie wissen, dass Sie ihn wegwerfen werden.

Eine Möglichkeit, die anfängliche Komplexität zu vereinfachen, besteht in der Verwendung von SQLite (einer Bibliothek, mit der Sie eine serverlose SQL-Datenbank erhalten, die in einer Datei gespeichert ist). Es ist ein flexibles Typensystem, sodass Sie sich nicht ernsthaft auf ein Schema festlegen müssen. Kein Server zum Konfigurieren / Herstellen einer Verbindung und Neuerstellen Ihrer Datenbank ist so einfach wie das Löschen einer Datei. Außerdem können Sie das DB-Image bei Bedarf einfach zusammen mit dem Code in die Versionskontrolle einbeziehen.


4
Scheint, als hättest du eine Ablehnung von der Flat File Society.
JeffO

@JeffO: SQLite speichert seine Datenbank als Flatfile.
Mr.Mindor

7
@ Mr.Mindor, die meisten Datenbanken tun das ... aber das ist irrelevant. "Flat File" bedeutet hier, die Datei direkt zu manipulieren, anstatt eine DB-Ebene zu durchlaufen.
GroßmeisterB

Nicht zustimmen. Ich müsste noch lernen, wie SQLite funktioniert, und Code implementieren, der SQLite-Datenbanken in .NET manipuliert, Abfrageergebnisse in Objekte konvertiert usw., damit die Entwicklung nicht einfacher wird. Es fügt nur alle Lasten der Erstellung einer Datenbank hinzu, ohne die Vorteile eines vollwertigen Datenbankservers.
Louis Rhys

11

Es ist ein Beispiel, das verwendet wird, um ein Konzept zu demonstrieren, anstatt ein Konzept an sich.

Das Konzept ist, dass Sie eine architektonische Entscheidung erst im letzten verantwortlichen Moment treffen , aber nicht später. In der Realität haben Sie jedoch häufig eine Entscheidung über die Datenbank, die Sie sehr früh verwenden werden. Das ist vielleicht nicht perfekt, aber es ist eine Tatsache.

Sobald diese Entscheidung getroffen wurde, können Sie sie nicht mehr aktiv umgehen. Das Speichern von Inhalten in einer vorhandenen Datenbank ist oft so einfach wie das Speichern in einer Einfachdatei.

Der Wechsel von MySQL unter Linux zu SQL Server unter Windows ist jedoch möglicherweise nicht so einfach wie der Wechsel von einer einfachen Datei zu SQL Server unter Windows. Das ist der wahre Punkt. Wenn es also Zweifel an der endgültigen Lösung gibt, wählen Sie die einfachste Option und berücksichtigen Sie Änderungen. Wenn Sie eine Entscheidung getroffen haben, bleiben Sie dabei.


Ich bin mit dem Migrationspfad nicht einverstanden. In technet.microsoft.com/en-us/library/cc966396.aspx finden Sie detaillierte Anweisungen zur Migration von MySQL nach MSSQL. Wenn Sie jedoch eine Flat-Datei in eine der beiden Optionen konvertieren möchten, müssen Sie eine ETL manuell in SSIS oder MySQL schreiben.
Jimmy Hoffa

@ JimmyHoffa: Ich weiß nicht, ein CSV ist ziemlich einfach. blog.sqlauthority.com/2008/02/06/… tech-recipes.com/rx/2345/import_csv_file_directly_into_mysql aber ich gehe davon aus , dass keiner der beiden Pfade so kompliziert ist.
pdr

6

Was beharrst du?

Ich bin in einem agilen Team und für eine Anwendung behalten wir fast alles in der Datenbank. Wäre dies nicht der Fall, hätte diese Anwendung nicht viel zu tun - die dauerhafte Speicherung von Dingen in einer Datenbank ist ein großer Teil ihrer Existenzberechtigung .

Also: Worauf bestehen Sie und was macht Ihre Bewerbung? Wenn es der Anwendung eigentlich egal ist, wo ihre Daten gespeichert bleiben, können Sie eine kleine Ebene schreiben, die die Entscheidung zwischen Flatfile und Datenbank trifft (diese Entscheidung kann irgendwo in einer Konfigurationsdatei gespeichert werden). Ich glaube , Sie müssen Ihre Anwendung und Ihre Daten zu bewerten und entscheiden , ob es sinnvoll , in Ihrem speziellen Fall macht die Zeit in Datenbankpersistenz zu investieren, oder einfach nur lesen / schreiben flache Dateien (die werden wahrscheinlich schneller in Bezug auf der Entwicklungszeit sein).


1
Die Anwendung verwaltet eine Warteschlange von Anforderungen und muss sich nach dem Schließen und Neustarten an die Warteschlange erinnern. Es besteht keine Verpflichtung, die Datenbank wie in Ihrer Anwendung zu verwenden
Louis Rhys,

@LouisRhys: Was wird mit diesen Warteschlangendaten gemacht? Einfach lesen und dem Benutzer anzeigen? Welche Vorteile erwarten Sie, wenn Sie in einer Datenbank bleiben?
FrustratedWithFormsDesigner

Die Aktionen in der Warteschlange werden ausgeführt. Zu den Vorteilen der Datenbank zählen die Leistung und das Parallelitätsmanagement. Wahrscheinlich kümmert sich der Client auch um die Sicherheit, Lesbarkeit und Abfrage von Daten.
Louis Rhys

@LouisRhys: Vielleicht könnten Sie für die erste oder zweite Iteration der Entwicklung eine flache Datei verwenden, um einen Proof-of-Concept- Vorgang durchzuführen , aber Sie möchten möglicherweise die Logik vollständig vom Datenzugriff trennen, da dies in Zukunft der Fall sein wird klingt so, als wäre eine Datenbank eine gute Sache (und das Wechseln von Datei zu Datenbank wird später mehr Zeit in Anspruch nehmen). Letztendlich ist dies eine erweiterte Architekturentscheidung, die nur Sie treffen können, da Sie Zugriff auf die Spezifikationen / Anforderungen des Kunden haben.
FrustratedWithFormsDesigner

5

Viele Leute missverstehen diesen Aspekt von Agilität als das, was bedeutet, dass sie künftige Funktionen nicht im Voraus planen sollten. Nichts ist weiter von der Wahrheit entfernt. Was Sie nicht tun, ist die Planung zukünftiger Funktionen, um die sofortige Wertschöpfung für Ihre Kunden zu verzögern.

Wie das auf so etwas wie Persistenz zutrifft, hängt stark von Ihrer Anwendung ab. Eines meiner aktuellen Hobbyprojekte ist ein Taschenrechner. Schließlich möchte ich in der Lage sein, benutzerdefinierte Konstanten und Funktionen zu speichern und den Zustand zu speichern, wenn ich das Programm schließe. Das erfordert Beharrlichkeit, aber ich habe noch nicht einmal darüber nachgedacht, welche Form dies annehmen würde. Mein Programm wird ohne Beharrlichkeit sehr brauchbar sein, und wenn ich es jetzt hinzufüge, wird sich meine erste Veröffentlichung erheblich verzögern. Ich hätte lieber einen funktionierenden Taschenrechner mit weniger Funktionen als gar keinen, während ich darauf warte, dass er perfekt ist.

Ein weiteres Hobbyprojekt von mir ist die Farbkorrektur von Videos und Fotografien. Diese Anwendung wird vollständig unbrauchbar sein, ohne dass meine laufenden Arbeiten gespeichert werden können. Der dafür erforderliche Code ist im gesamten Programm vorhanden. Wenn ich es nicht von Anfang an richtig verstehe, kann es unerschwinglich sein, es zu ändern. Deshalb habe ich mich ganz schön bemüht, im Vorfeld durchzuhalten.

Die meisten Projekte würden irgendwo dazwischen liegen, aber Sie sollten sich nie schlecht fühlen, wenn Sie zukünftige Funktionen planen, wenn dies jetzt nur wenig oder gar keinen zusätzlichen Aufwand bedeutet. Datenbanken mögen komplex sein, aber der größte Teil dieser Komplexität verbirgt sich hinter einer soliden, gut getesteten Oberfläche. Die Arbeit, die Sie in Ihrer Anwendung erledigen müssen, kann für eine Datenbank sehr wohl weniger sein als für eine flache Datei, da Ihnen alle Funktionen einer Datenbank kostenlos zur Verfügung stehen. Es gibt "Hybrid" -Optionen wie SQLite, wenn Sie den Ärger eines Datenbankservers noch nicht bewältigen möchten.


1
"Pläne sind nutzlos, aber Planung ist unerlässlich." - Eisenhower
Alex Chaffee

3

Ich denke, Sie konzentrieren sich auf die falschen Werte. In Agile steht der Geschäftswert im Mittelpunkt. Sie erstellen ein Produkt, um einigen Endbenutzern einen Geschäftswert zu liefern.

Wenn Sie die Persistenzschicht zu spät erstellen oder auf Ihrem Weg nachholen, ist dies Ihre Strategie, um dem Kunden einen Geschäftswert zu liefern. Ich glaube nicht, dass der Begriff "agil" selbst vorschreibt, ob Sie das eine oder andere tun sollten.

Der Standpunkt zur Verzögerung der Datenspeicherungsstrategie wird in dieser Präsentation von Robert C. Martin (einem der Autoren des agilen Manifests) vertreten.

Es ist eine sehr gute Präsentation, ich kann empfehlen, dass Sie es sehen.

Aber damit bin ich nicht einverstanden! Zumindest zu einem gewissen Grad.

Ich glaube nicht, dass Sie eine User Story für "Fertig" aufrufen können, wenn die User Story Daten enthält, die beibehalten werden sollten, und Sie tatsächlich keine Art von Persistenz implementiert haben.

Wenn der Product Owner entscheidet, dass es jetzt Zeit ist, live zu gehen, können Sie dies nicht tun. Und wenn Sie erst spät im Projekt mit der Implementierung von Persistenz begonnen haben, wissen Sie auch nicht, wie lange es dauern würde, die Persistenzschicht zu implementieren, was ein großes Projektrisiko darstellt.

Die agilen Projekte, an denen ich gearbeitet habe, haben die Datenzugriffsstrategie nicht verschoben. Aber es wurde entkoppelt, so dass wir es auf dem Weg ändern können. Und das gesamte Datenbankschema ist nicht von vornherein konzipiert. Tabellen und Spalten werden auf dem Weg erstellt, den sie benötigen, um den gespeicherten Benutzer zu implementieren, der letztendlich den geschäftlichen Wert liefert.


1

Es erfordert ein gutes Urteilsvermögen und Erfahrung, um festzustellen, welche Fragen zuerst beantwortet werden müssen, wenn ein neues Projekt gestartet wird.

Wenn das Endprodukt noch nicht bekannt ist, hilft Ihnen das Erstellen / Prototyping schnell, dies herauszufinden, und es kann hilfreich sein, es agil zu iterieren. Dies birgt natürlich das Risiko, dass spät im Prozess festgestellt wird, dass die Implementierung der Persistenz länger dauern wird, als Sie Ihren Stakeholdern mitgeteilt haben.

Wenn das Endprodukt bekannt ist, ist es möglicherweise wichtiger, frühzeitig zu wissen, wie die Persistenz in Ihrer Anwendung funktioniert. Das Risiko besteht darin, dass später im Entwicklungsprozess Probleme mit Ihrer Produktspezifikation auftreten.


0

Flat Files sind nicht einfach!

Sie erlauben Lagerung und das ist alles. Die Struktur der Daten, Zugriffspfade usw. liegt ganz bei Ihnen, und es gibt zahlreiche Möglichkeiten, dies falsch zu verstehen.

Es gibt Gründe, warum Datenbanken existieren, und einer davon ist, die Dinge für Entwickler einfacher zu machen.

Der größte Teil meiner Entwicklung wird für große Systeme in großen Unternehmen durchgeführt. Wir haben immer ein vollständiges und gut durchdachtes Datenmodell, bevor wir mit dem Design oder der Entwicklung fortfahren. Ein Datenmodell hilft Ihnen, Ihr Problem zu verstehen und ermöglicht eine saubere Implementierung.

Vergessene Datenelemente, nicht übereinstimmende Datenstrukturen und andere Albträume können durch die Erstellung eines Datenmodells im Voraus vermieden werden.

Sie können die tatsächliche Auswahl der Datenbanktechnologie bis nach dem Datenmodell belassen. Bei den meisten "Persistenz" -Technologien handelt es sich jedoch um eng gebundene Programmier- und sogar Designstile. Wenn Sie für eine relationale Datenbank codieren und später zu einem Wert für einen trüben Schlüssel wechseln, müssen Sie die Hälfte Ihres Codes vollständig neu schreiben.

Wenn Sie mit einfachen Dateien beginnen und zu einer relationalen Datenbank wechseln, werden Sie wahrscheinlich die Hälfte Ihres Codes wegwerfen, da Ihre Entwickler ihre Zeit mit der Implementierung einer pissarmen Datenbank verschwendet haben.


-1

Sollten Sie versuchen, vor der Datenbank eine flache Datei zu behalten?

Ja, du solltest es versuchen. Vor allem, wenn Sie es noch nie probiert haben. Egal wie es ausgeht, Sie werden etwas lernen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.