Czy w zwinnym programowaniu powinienem spróbować wytrwać w pliku płaskim przed bazą danych?


21

Ktoś mi wyjaśnił, że ponieważ w zwinnym programowaniu polityka i logika aplikacji powinny być ważniejsze niż szczegóły, takie jak metoda trwałości, decyzja o trwałości powinna zostać podjęta na końcu. Dobrym pomysłem może być rozpoczęcie od prostszej trwałości, takiej jak pliki płaskie, aż do momentu, gdy słabość tej metody stanie się widoczna, i dopiero wtedy zmienimy trwałość, np. Za pomocą relacyjnej bazy danych.

Czy to prawda, czy też źle zrozumiałem tę koncepcję? Czy w ten sposób zwinny zespół zwykle buduje aplikacje? Jakie są tego powody i kiedy nie powinienem przyjmować takiego podejścia?


1
Logika trwałości nie jest częścią drobnych szczegółów lub jest mniej ważna. To musi być pierwsza decyzja. Chcesz właściwości ACID dla swojej struktury trwałości. Decyzji tej nie można utrzymać w oczekiwaniu.
Manoj R

Odpowiedzi:


42

Przekazana koncepcja jest z pewnością częścią zwinnej i istotnej idei przeniesienia rzeczy do ostatniej odpowiedzialnej chwili.

Jednak podany przykład faktycznie opiera się na całkowicie fałszywym założeniu na początek:

że wdrożenie bazy danych o płaskich plikach jest łatwiejsze / mniejsze niż korzystanie z RDBMS. - Często całkowicie fałszywe

Przykładem powinno być: Warstwa trwałości jest utrzymywana do możliwie najprostszej implementacji, dopóki nie zostanie podjęta decyzja, że ​​jest nieodpowiednia.

Dla wielu zespołów programistów przygotowanie bazy danych do zrobienia tego jest kwestią godziny lub dwóch (lub 15 minut dla małej bazy danych z ORM), podczas gdy baza danych z płaskimi plikami, z którą nie muszą się wtrącać, może być ogromny ból i irytacja, ponieważ muszą ręcznie napisać cały kod typu wyszukiwania i konstrukcji tabeli danych ręcznie, gdy baza danych może być tak prosta, jak utworzenie tabeli w interfejsie użytkownika, dodanie kilku kolumn, a następnie ORM wygeneruje wszystko inaczej potrzebujesz.

Ponadto, jeśli nie znasz swojej warstwy trwałości na początek, jeszcze bardziej odpowiednie jest rozpoczęcie od wspólnego RDBMS, który Twój zespół dobrze zna, aby zmiana późniejsza z płaskiego pliku na RDBMS była znacznie większa niż później. zmiana jednego RDBMS na inny. Istnieje wiele narzędzi do konwersji z większości popularnych RDBMS na inne takie i wskazówki, ponieważ jest to dobrze przebyta ścieżka. Istnieje bardzo niewiele narzędzi do konwersji z pliku płaskiego do dowolnego RDBMS, w którym plik płaski ma zastrzeżony format, dla którego oprzyrządowanie nie zostało wcześniej zapisane poza własnymi bibliotekami.

Podsumowując: koncepcja jest poprawna i dokładna, ale przykład oparty jest na strasznie dużym i często (prawie zawsze) niedokładnym założeniu .


6
A twoim strasznie dużym założeniem jest to, że muszą ręcznie napisać ręcznie cały kod typu wyszukiwania i tabeli danych! :-) Zazwyczaj, gdy używasz płaskiego pliku, zaczynasz od użycia wbudowanego formatu serializacji w swoim języku (np. Marshal w Ruby lub NSKeyedArchiver w Cocoa / Objective-C) i po prostu zrzucasz niektóre istniejące obiekty wewnętrzne. Tak długo, jak twoja aplikacja nie musi przeładowywać się zbyt często, i dopóki masz kontrolę nad zmianami schematu w różnych wersjach aplikacji, ta technika może działać wyjątkowo dobrze przez długi czas, szczególnie podczas programowania.
Alex Chaffee,

@AlexChaffee słuszna racja, ale tak czy inaczej musisz napisać jakiś kod wokół tych rzeczy w taki czy inny sposób, a współczesne ORM sprawiają, że robienie takich rzeczy z RDBMS lub NoSQL jest dość równoważne w trywialności, gdzie różnica w wpływie na zespół jest opierając się bardziej na umiejętnościach drużyn niż cokolwiek innego, po prostu uważam, że to zły przykład, aby zilustrować punkt, który próbuje z tego powodu. Osobiście korzystam z MSSQL od 13 lat, ale na miejscu podkręciłbym MongoDB za upór ze względu na prostotę, aby nie wpływał na prawdziwy cel projektu, dopóki ACID nie miał znaczenia.
Jimmy Hoffa

17

Ponieważ wiesz, że będziesz używać bazy danych, pisanie kodu do obsługi plików płaskich nie ma większego sensu. Możesz przejść przez kilka iteracji przy użyciu plików CSV tylko do odczytu, ale szybko odkryjesz, że piszesz kod, o którym wiesz, że go wyrzucisz.

Jedną z rzeczy, które możesz zrobić, aby uprościć początkową złożoność, jest użycie czegoś takiego jak SQLite (biblioteka, która udostępnia bezserwerową bazę danych SQL przechowywaną w pliku). Ma elastyczny system typów, więc nie musisz poważnie przypisywać się do schematu, żaden serwer do skonfigurowania / połączenia z bazą danych i odbudowania jej nie jest tak prosty, jak usunięcie pliku. Pozwala także w razie potrzeby dołączyć obraz DB wraz z kodem do kontroli wersji.


4
Wygląda na to, że otrzymałeś opinię od Flat File Society.
JeffO,

@JeffO: SQLite zapisuje swoją bazę danych w płaskim pliku.
Mr.Mindor,

7
@ Mr.Mindor, większość baz danych robi ... ale to nie ma znaczenia. „Płaski plik” oznacza tutaj bezpośrednie manipulowanie plikiem, a nie przechodzenie przez jakąś warstwę DB.
GrandmasterB,

Nie zgadzać się. Nadal będę musiał nauczyć się, jak działa SQLite i zaimplementować kod, który manipuluje bazą danych SQLite w .NET, przekonwertować wyniki zapytania na obiekty itp., Aby nie ułatwiało to programowania. Po prostu dodaje wszystkie obciążenia związane z tworzeniem bazy danych, bez korzyści pełnoprawnego serwera bazy danych.
Louis Rhys,

11

Jest to przykład wykorzystany do przedstawienia koncepcji, a nie samej koncepcji.

Chodzi o to, że nie podejmujesz decyzji architektonicznej do ostatniej odpowiedzialnej chwili , ale nie później. Ale w rzeczywistości często podejmujesz decyzję dotyczącą bazy danych, z której będziesz korzystać bardzo wcześnie. To może nie być idealne, ale to fakt.

Po podjęciu tej decyzji nie aktywnie jej unikasz. Przechowywanie czegoś w istniejącej bazie danych jest często tak proste, jak przechowywanie go w płaskim pliku.

Ale przejście z MySql w systemie Linux na SQL Server w systemie Windows może nie być tak proste, jak przejście z płaskiego pliku w dowolnym miejscu do SQL Server w systemie Windows. To jest prawdziwy punkt. Tak więc, chociaż istnieją wątpliwości co do ostatecznego rozwiązania, wybierz najprostszą możliwą opcję, uwzględniając zmianę. Po podjęciu decyzji trzymaj się jej.


Nie zgadzam się co do ścieżki migracji. technet.microsoft.com/en-us/library/cc966396.aspx zawiera szczegółowe instrukcje dotyczące migracji z MySQL do MSSQL, jednak konwersja pliku płaskiego na dowolny wybór wymagałaby ręcznego pisania ETL w SSIS lub wersji MySQL.
Jimmy Hoffa

@JimmyHoffa: Nie wiem, CSV jest dość łatwe. blog.sqlauthority.com/2008/02/06/… tech-recipes.com/rx/2345/import_csv_file_directly_into_mysql, ale uważam, że żadna ścieżka nie jest tak skomplikowana.
pdr

6

Co upierasz się?

Jestem zwinnym zespołem i dla jednej aplikacji utrzymujemy prawie wszystko w bazie danych. Pamiętaj, że gdybyśmy tego nie zrobili, to nie byłoby wiele do zrobienia dla tej aplikacji - utrwalanie rzeczy w bazie danych jest dużą częścią jej racji bytu .

Więc: co nadal trwa i co robi twoja aplikacja? Jeśli aplikacja tak naprawdę nie dba o to, gdzie przechowywane są jej dane, możesz napisać małą warstwę, która podejmie decyzję (tę decyzję można zapisać gdzieś w pliku konfiguracyjnym) pliku płaskiego kontra baza danych. Myślę, że trzeba ocenić aplikację i swoje dane i zdecydować, czy ma to sens w przypadku konkretnego zainwestować czas utrzymywania się w bazie danych, lub po prostu odczytu / zapisu plików płaski (który będzie prawdopodobnie szybciej pod względem czasu rozwój).


1
Aplikacja zarządza kolejką żądań i musi pamiętać kolejkę po zamknięciu i ponownym uruchomieniu. Nie ma obowiązku korzystania z bazy danych jak w aplikacji
Louis Rhys

@LouisRhys: Co zostanie zrobione z danymi w kolejce? Po prostu czytasz i wyświetlasz użytkownikowi? Jak myślisz, jakie korzyści przyniesie ci utrzymanie się w bazie danych?
FrustratedWithFormsDesigner

akcje w kolejce zostaną wykonane. korzyści z bazy danych obejmują wydajność, zarządzanie współbieżnością i prawdopodobnie klient będzie również dbał o bezpieczeństwo, czytelność i zapytania danych.
Louis Rhys,

@LouisRhys: Być może przy pierwszej iteracji lub dwóch pracach rozwojowych możesz użyć pliku płaskiego, aby uzyskać poprawną koncepcję działania, ale możesz chcieć całkowicie oddzielić logikę od dostępu do danych, ponieważ w przyszłości będzie to wygląda na to, że baza danych może być dobrą rzeczą (a zmiana z pliku na db zajmie więcej czasu później). Ostatecznie jest to decyzja dotycząca zaawansowanej architektury, którą tylko Ty możesz podjąć, ponieważ masz dostęp do specyfikacji / wymagań klienta.
FrustratedWithFormsDesigner

5

Wiele osób błędnie interpretuje ten aspekt zwinności, co oznacza, że ​​nie powinni planować z wyprzedzeniem przyszłych funkcji. Nic nie może być dalej od prawdy. To, czego nie robisz, pozwala zaplanować przyszłe funkcje, aby opóźnić dostarczanie wartości swoim klientom teraz.

To, jak odnosi się to do trwałości, zależy w dużej mierze od twojej aplikacji. Jednym z moich bieżących projektów hobby jest kalkulator. W końcu chciałbym móc przechowywać stałe i funkcje zdefiniowane przez użytkownika oraz zapisywać stan po zamknięciu programu. Wymaga to wytrwałości, ale nawet nie zastanawiałem się, jaką formę by to przybierało. Mój program będzie bardzo użyteczny bez wytrwałości, a dodanie go teraz spowoduje znaczne opóźnienie mojej pierwszej wersji. Wolę mieć działający kalkulator z mniejszą liczbą funkcji niż w ogóle, czekając na jego perfekcję.

Innym moim hobby jest korekcja kolorów wideo i zdjęć. Ta aplikacja będzie całkowicie bezużyteczna bez możliwości zapisania mojej pracy w toku, a kod potrzebny do tego jest wszechobecny w całym programie. Jeśli nie rozumiem od samego początku, zmiana może być zbyt trudna, więc sporo wysiłku poświęciłem wytrwałości.

Większość projektów mieściłaby się gdzieś pomiędzy, ale nigdy nie powinieneś czuć się źle z planowaniem przyszłych funkcji, jeśli nie doda to teraz żadnego dodatkowego wysiłku. Bazy danych mogą być złożone, ale większość tej złożoności jest ukryta za solidnym, dobrze przetestowanym interfejsem. Praca, którą będziesz musiał wykonać w swojej aplikacji, może być znacznie mniejsza w przypadku bazy danych niż zwykłego pliku, ze względu na wszystkie funkcje, które baza danych oferuje za darmo. Istnieją opcje „hybrydowe”, takie jak SQLite, jeśli nie chcesz jeszcze radzić sobie z problemem serwera bazy danych.


1
„Plany są bezużyteczne, ale planowanie jest niezbędne”. - Eisenhower
Alex Chaffee

3

Myślę, że koncentrujesz się na niewłaściwych wartościach. W zwinnym kluczem jest wartość biznesowa. Tworzysz produkt w celu zapewnienia wartości biznesowej niektórym użytkownikom końcowym.

Jeśli tworzysz warstwę trwałości z opóźnieniem lub nadrabiasz ją po drodze, twoja strategia dostarczania wartości biznesowej klientowi. Nie wierzę, że sam termin „zwinny” decyduje o tym, czy powinieneś to zrobić.

W tej prezentacji Robert C. Martin (jeden z autorów zwinnego manifestu) popiera pogląd na odroczenie strategii przechowywania danych .

To bardzo dobra prezentacja, mogę polecić jej obejrzenie.

Ale nie zgadzam się z tym! Przynajmniej do pewnego stopnia.

Nie wierzę, że można nazwać historię użytkownika „Gotowe”, jeśli historia użytkownika zawiera dane, które powinny zostać utrwalone, a tak naprawdę nie ma zaimplementowanego żadnego rodzaju trwałości.

Jeśli właściciel produktu zdecyduje, że teraz jest czas na uruchomienie, nie możesz tego zrobić. A jeśli nie zacząłeś wdrażać trwałości do późnej fazy projektu, nie masz również informacji o tym, ile czasu zajmie wdrożenie warstwy trwałości, pozostawiając poważne ryzyko projektu.

Zwinne projekty, nad którymi pracowałem, nie odroczyły strategii dostępu do danych. Ale został oddzielony, co pozwala nam to zmienić po drodze. A cały schemat bazy danych nie został zaprojektowany z góry. Po drodze tworzone są tabele i kolumny, ponieważ są one wymagane w celu zaimplementowania przechowywanego przez użytkownika użytkownika, który ostatecznie zapewnia wartość biznesową.


1

Potrzeba dobrego osądu i doświadczenia, aby zobaczyć, na które pytania należy najpierw odpowiedzieć, rozpoczynając nowy projekt.

Jeśli produkt końcowy jest nadal nieznany, szybkie budowanie / prototypowanie pomoże ci to rozgryźć, i tak, iteracja w zwinny sposób pomoże. To oczywiście wiąże się z ryzykiem, takim jak odkrycie na późnym etapie procesu, że wdrożenie uporczywości zajmie więcej czasu niż poinformowałeś swoich interesariuszy.

Jeśli produkt końcowy jest dobrze znany, ważniejsze jest wcześniejsze zrozumienie, jak wytrwałość będzie działać w aplikacji. Istnieje ryzyko, że znajdziesz problemy ze specyfikacją produktu na późniejszym etapie procesu programowania.


0

Pliki płaskie nie są proste!

Pozwalają na przechowywanie i to wszystko. Struktura danych, ścieżki dostępu itp. Zależą od Ciebie i istnieje wiele sposobów, aby to naprawić.

Istnieją powody, dla których istnieją bazy danych, a jednym z nich jest uproszczenie dla programistów.

Większość mojego rozwoju dotyczy dużych systemów w dużych firmach. Zawsze mamy kompletny i przemyślany model danych, zanim przystąpimy do dalszego projektowania lub rozwoju. Model danych pomaga zrozumieć problem i pozwala na czystą implementację.

Zapomnianych elementów danych, niedopasowanych struktur danych i innych koszmarów można uniknąć, tworząc model danych z góry.

Możesz pozostawić swój faktyczny wybór technologii baz danych aż do modelu danych. Ale większość technologii „trwałości” to ściśle związane programowanie, a nawet style projektowania. Jeśli kodujesz relacyjną bazę danych, a później zdecydujesz się na zmianę na chmurną wartość klucza, będziesz musiał całkowicie ponownie napisać połowę kodu.

Jeśli zaczniesz od płaskich plików i przełączysz się na relacyjną bazę danych, prawdopodobnie skończysz wyrzucaniem połowy kodu, ponieważ programiści zmarnują czas na wdrożenie słabej bazy danych.


-1

Czy powinieneś spróbować wytrwałości w płaskim pliku przed bazą danych?

Tak, powinieneś spróbować. Zwłaszcza jeśli nigdy wcześniej tego nie próbowałeś. Bez względu na to, jak się okaże, nauczysz się czegoś.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.