Czy ciągłe tworzenie i usuwanie tabel jest oznaką architektonicznej wady?

11

Niedawno rozmawiałem z programistą, który wspomniał, że podczas tworzenia programu rutynowo regularnie tworzą i usuwają tabele i kolumny, pracując nad nowymi funkcjami i uzasadniając rzeczy, mówiąc, że jest to normalne, gdy używa się zwinnego procesu programistycznego.

Ponieważ większość mojego tła wywodzi się ze środowiska programowania kaskadowego, zastanawiam się, czy jest to właściwie uważane za właściwe w przypadku zwinnego programowania, czy też może to być oznaką podstawowego problemu, zarówno z architekturą programu, jak i z postępem zwinnego procesu.

rjzii
źródło
Jeden komentarz do bazy danych, kiedy ostatni raz sprawdzono, jest tam ponad 700 tabel i inni słyszeli o tym, że „nie ma wystarczająco dużo czasu, aby to zmienić”.
rjzii
24
700 stolików i za mało czasu na refaktoryzację? Wyczuwam tutaj porażkę.
Adam Crossland
7
700 używanych tabel lub 700 tabel, z których wiele to sieroty?
Ben Brocka
1
@AdamCrossland Poważnie ... Ooh That Smell Lynyrda Skynyrda przychodzi mi na myśl. Ale poważnie, zdenormalizowane tabele są czasem dobrym wyborem dla baz danych z dużą ilością danych lub baz danych, które mają duże obciążenie raportowaniem.
wałek klonowy
1
@maple_shaft Oczywiście, każda technologia może być nadużywana, podobnie jak wszystko inne, co trzeba rozważyć zalety / wady i przetestować, przetestować, przetestować. Zmaterializowane widoki mogą jednak zaoferować ci wyjście, jeśli okaże się, że denormalizujesz swoje stoły. Myślę, że twój punkt widzenia to kolejny powód, dla którego warto mieć DBA lub przynajmniej programistę z silnym DB-fu dla personelu, aby wycofać lejce, gdy wszyscy inni ładują się z wyraźnie słabym projektem. Moja najlepsza praca przyszła nie podczas kodowania lub projektowania, ale uniemożliwiała innym podejmowanie okropnych, okropnych decyzji.
Mike Cellini

Odpowiedzi:

21

Każdego dnia staje mi się coraz bardziej widoczne, że „zwinny” staje się synonimem źle przemyślanego, chaotycznego, pośpiesznego i siedzącego na spodniach. I żadna z tych rzeczy nie jest zgodna z podejściem zwinnym, jak rozumiem.

Posiadanie skutecznego i powtarzalnego procesu Agile nie jest łatwe i nie sądzę, że z natury zmniejsza całkowite nakłady pracy, nawet jeśli może to prowadzić do lepszych produktów.

Jeśli powiedzieli, że nie mają czasu na „refaktoryzację” bazy danych, prawdopodobnie również nie mają czasu na konfigurowanie wersji i migracji bazy danych. Prawdopodobnie nie poświęcili czasu na stworzenie pakietu testów funkcjonalnych. Wszystkie te rzeczy są tym, o czym myślę, gdy myślę o solidnym procesie Agile, który zmierza do sukcesu.

W końcu Agile to tylko słowo. To, co robisz na co dzień, określa, czy odniesiesz sukces, czy nie.

Adam Crossland
źródło
2
Skuteczny proces Agile powinien oznaczać więcej pracy z góry, ponieważ po każdym sprincie skupiono się na dostarczaniu tylko funkcjonalnego oprogramowania. Jeśli zrobione dobrze, to prowadzi do większej szansy na sukces. Wodospad jest w rzeczywistości znacznie bardziej wydajny, jeśli założymy, że wymagania są statyczne, a zasoby projektu nie popełniają błędów. Jest to jednak fantazja w większości sytuacji.
wałek klonowy
1
@maple_shaft, właśnie tak. Bycie zwinnym nie usuwa ciężkiej pracy z budowaniem produktów.
Adam Crossland
2
Mam przeczucie, że jeśli ten zespół zastosowałby podejście do wodospadu, byłoby to równie chaotyczne, a każda prośba o zmianę byłaby katastrofą.
JeffO
Dobrze powiedziane, Jeff O.
Adam Crossland
11

Chociaż nie jest niczym niezwykłym tworzenie i upuszczanie tabel podczas ewolucji projektu, może być konieczne pewne czyszczenie, aby upewnić się, że baza danych naprawdę używa wszystkich tych tabel.

Tak, w Agile chodzi o refaktoryzację, ale jeśli teraz mówią, że system jest zbyt duży, aby refaktoryzować, przestali robić Agile i teraz są tylko programowaniem Cowboy. Zespół programistów nie lubi nazywać się tak, ale to właśnie robią. Jazda na strzelnicy strzelająca do wszystkiego, co się rusza.

DBA pomoże, tylko upewnij się, że masz DBA, który rozumie zarówno programowanie, jak i programowanie zwinne. Twój zespół programistów musi zostać uwięziony, a nie wtrącony do więzienia.

Bill Leeper
źródło
5

Ogólnie rzecz biorąc, tworzenie nowych tabel i dodawanie nowych kolumn jest bardzo normalne w procesie, w którym programowanie i administrowanie bazą danych nie są ściśle oddzielone. Nowa funkcja może tworzyć nowe dane, które muszą gdzieś iść. Spróbuj zbyt surowo, aby tego uniknąć, a skończysz na modelu z wewnętrzną platformą .

Dobrze napisane oprogramowanie prawie nie zauważa tych nowych obiektów bazy danych, więc nic się nie psuje tylko z powodu nowej kolumny w tabeli.

Z drugiej strony regularne upuszczanie kolumn, a nawet tabel jest podejrzane. Nowa funkcja nigdy nie wymaga usuwania stołu, więc może to oznaczać, że ludzie pracują całkowicie bez planu.

użytkownik 281377
źródło
1
Tworzenie nowych tabel i kolumn nie przeszkadza mi, gdy jest to uzasadnione, ale wskazano, że usunięcie tabel (i kolumn w tym zakresie) ogólnie oznacza, że ​​część pracy została utracona z powodu niewłaściwego planowania lub podjęcia decyzji przez inną osobę funkcja nie była w końcu potrzebna. Podobnie liczba ścinania tabel jest problemem z uwagi na brak w nich normalizacji.
rjzii
Dokładnie. Nie przejmuj się dużą liczbą stolików, większość z nich i tak jest nieużywana i być może wkrótce zostaną usunięte. SCNR
281377
Problem polega na tym, że wszystkie są używane, nawet jeśli dotyczy to tylko jednego rekordu.
rjzii
4

Jeśli twoja baza danych może być łatwo wersjonowana i migrowana, a masz testy, aby udowodnić, że zmienianie rzeczy nie psuje rzeczy, prawdopodobnie masz dość sprawny proces.

W świetle komentarzy - generalnie do ich skutku, grupa kowbojów usprawiedliwiających się zwinnością - krzyczy. Szybki. I opublikuj wszystko, co możesz, na thedailywtf.com, abyśmy wszyscy mogli cieszyć się twoim przerażeniem.

Wyatt Barnett
źródło
Smutne jest to, że baza danych nie jest łatwa do wersjonowania, migracji i że w najlepszym razie istnieją ograniczone testy. Programiści często nadpisują zmiany wprowadzone przez innych programistów.
rjzii
5
Zdecydowanie programowanie Cowboy. Jeśli masz zespół zarządzający odpowiedzialny za ten „zwinny” wysiłek, upewnij się, że wyświadczysz im ten zespół, że nadużywają zwinnego i po prostu amok.
Bill Leeper
1
@RobZ Agile nie usprawiedliwia słabego zasięgu testów jednostkowych i złego projektu bazy danych. To brzmi jak gorący bałagan.
wałek klonowy
2
fuj! nie wersji !!! nic dziwnego, że to bałagan. Drżę na myśl o tym, jak wygląda kod aplikacji.
ozz
4
Zasadniczo ten zespół nie robi nic zwinnego, są tylko zespołem AdHoc. Jeśli istnieje struktura zarządzania, możesz anonimowo lub osobiście zgłosić wątpliwości w łańcuchu. Powiedz im, że widzisz ogromną katastrofę w bazie danych, brak testów i niewłaściwe praktyki zarządzania kodem. Ten zespół zmierza do ogromnej FAIL.
Bill Leeper
3

Podobnie jak większość odpowiedzi tutaj na StackExchange, odpowiedź powinna brzmieć „to zależy”. W zwinnym opracowywaniu wymagania i specyfikacje są wykrywane podczas wdrażania.

Jednak przy zwinnym rozwoju, gdy model relacyjny jest odpowiednio znormalizowany, dodanie nowych atrybutów do relacji rzadko powinno być koniecznością, nowe byty powinny zasadniczo odnosić się do starszych, biorąc pod uwagę odpowiedni model.

Większość programistów nie normalizuje swoich baz danych z powodu ograniczeń czasowych, lenistwa, niekompetencji lub złożoności zapytań. Renormalizacja wymaga transferu istniejących danych, modyfikacji DAO itp. Itp., Co generuje czynnik ryzyka.

Dibbeke
źródło
W którym momencie sprawnego procesu magicznie pojawia się odpowiedni model dla wszystkich przyszłych żądań zmian?
JeffO
Po prawidłowym przestudiowaniu domeny. Istnieje ograniczona liczba właściwości, które całkowicie definiują byt. Niektóre (coraz bardziej złożone) przykłady: punkt 2D jest całkowicie zdefiniowany przez dwie współrzędne, adres jest całkowicie zdefiniowany przez kraj, wersję pola i realizację zestawu pól adresu zdefiniowanych przez inny podmiot (przy użyciu identyfikatora kraju, wersji i ograniczenia).
Dibbeke
@Dibbeke: A potem pojawiają się problemy biznesowe, takie jak traktowanie UE (27 krajów) jako jednego kraju w przypadkach X, Y i Z. Lub traktowanie stanów USA jako krajów. Lub uświadomienie sobie, że niektóre wpisy DB mają 2 reprezentacje adresów dla jednego adresu.
MSalters
3

Aby odpowiedzieć na twoje pytanie, nie, to nie jest normalne w procesie Agile.

To, co może wydawać się wynikać z podejścia Agile, wynika z jego krótkiego cyklu projektowania / opracowywania / testowania, a nacisk Agile na lekkie rozwiązania, które spełniają znane wymagania, ale są dobrze skonstruowane, aby móc sprostać nowym wymaganiom dzięki minimalna zmiana. Biorąc pod uwagę te dwie rzeczy, możesz powiedzieć, że programista, nie wiedząc, co może przyjść później, ale wiedząc, że jego zmiana nie powinna wpłynąć na DB w sposób, którego nie można cofnąć, po prostu wprowadza niezbędne zmiany w schemacie w „najlżejszy” możliwy sposób, a następnie co pewien czas kilka zestawów „lekkich” zmian zostanie przekształconych w coś bardziej trwałego i stabilnego.

Powiedziawszy to, nie pracowałem jeszcze z programistą, który podpisał się pod teorią i metodologią Agile, a także pomyślałem, że rutynowe tworzenie i usuwanie tabel w schemacie jest konieczne z jakiegokolwiek powodu. Zwinne nie oznacza doskakiwania ani wkręcania. Jeśli otrzymasz historię, która wymaga dodania nowego pola danych należącego do określonego rekordu, dodajesz to pole do tabeli. Jeśli ta zmiana coś psuje, to zastanawiasz się, dlaczego i dokonujesz innych zmian, które mogą być konieczne (mogę myśleć o bardzo niewielu rzeczach, które mogłyby się zepsuć, dodając kolumnę do sprawdzanego DB; jeśli zepsuje się z tego rodzaju zmianą, ty mają większe problemy). Refaktoryzacja jest zwykle ograniczona do kodu; zmiana schematu jest zwykle bardziej zaangażowanym procesem niż zmiana kodu, więc kiedy zmiany schematu muszą nastąpić, zwykle są wykonywane z większą ostrożnością, i przynajmniej trochę uwagi poświęconej znajomości przyszłego kierunku projektu. Konieczność przebudowy części lub całości bazy danych wskazuje na fundamentalny błąd projektu; bycie zwinnym nie oznacza, że ​​nie ma „ogólnego planu” podstawowych zasad architektury i projektowania, których należy przestrzegać, jednocześnie budując program i strukturę danych.

Teraz w Agile są przypadki, w których to, co „wiesz” teraz, będzie sprzeczne z tym, czego nauczysz się później. Załóżmy, że masz wymóg, aby twój system miał adres dla każdej osoby. Ponieważ jest to relacja 1: 1, a dane będą potrzebne w większości przypadków, wystarczy dodać pola Adres do tabeli Osoby. Tydzień później otrzymasz wymaganie, aby Osoba mogła mieć więcej niż jeden adres. Teraz jest to relacja 1: N i aby odpowiednio go modelować, musisz cofnąć poprzednie zmiany, dzieląc pola na nową tablicę adresów. To nie jest rutyna, szczególnie wśród starszych programistów. Doświadczony programista zobaczy, że osoba ma adres, uzna je za odrębne koncepcyjnie i utworzy tabelę osób i tablicę adresów, łącząc osobę z adresem z referencją FK do adresu ID. Schemat taki jak ten jest łatwiejszy do zmiany w przypadku zmiany charakteru relacji; bez tworzenia lub usuwania całych „szerokich” tabel danych relację między osobą a adresem można dość łatwo zmodyfikować z 1: 1 na 1: N na N: N.

KeithS
źródło
2

Podczas pracy pod Agile nie skupia się tak bardzo na projektowaniu, więc nie uważam tego za ogromny problem, z pewnością w przypadku pierwszego wydania.

Trudno jest komentować system, który ma 700 tabel, których nie widziałem, może potrzebować wszystkich, ale może się zdarzyć, że baza danych nie będzie wystarczająco dobrze zarządzana.

Nawet w przypadku zwinności w przypadku dużego systemu dość często zdarza się, że ktoś / zespół jest odpowiedzialny za schemat.

ozz
źródło
2

Jeśli często wprowadzają takie zmiany - szczególnie upuszczając tabele i kolumny w aplikacjach na żywo - wydaje się to oznaką braku doświadczenia. Nie ma to nic wspólnego z jakimkolwiek procesem, który, jak twierdzą, postępuje. „Zwinne” nie jest usprawiedliwieniem, aby nie usiąść i nie pomyśleć o danych, które musisz przechowywać, i ich relacjach, zanim zaczniesz wymyślać kod. Jeśli stwierdzą, że zmieniają więcej niż 10-20% początkowej struktury, to dla mnie wskaźnik oznacza, że ​​albo nie zastanawiają się nad tym, albo nie mają dużego doświadczenia w analizie wymagań i projektowaniu baz danych, więc po prostu stają się zbyt na początku wiele z tego źle.

Grandmaster B.
źródło
2

Choć brzmi to tak, jakby Twój zespół był po prostu kodowaniem kowbojskim, tak naprawdę nie powinno być nic złego w refaktoryzacji kodu LUB baz danych. To nie strata pracy - dostosowuje się do nowo poznanej rzeczywistości.

Sugerowałbym, że zespół potrzebuje piaskownicy do wypróbowania zmian, przeprowadzenia testów, odesłania ich do użytkowników i zdecydowania, czy mają sens. W tym momencie integracja zmian, które mają sens - z odpowiednimi testami regresji - w twoim schemacie powinna być w porządku.

Matthew Flynn
źródło
1

Zwinność polega na kodowaniu, bazy danych nie są kodem. Zmiana bazy danych powinna być traktowana jak przebudowa domu. Ludzie jakoś uwierzyli, że zwinne środki działają teraz, planują później, co jest całkowicie nieprawdziwe. Nawet przy zwinnych metodach należy poświęcić czas na planowanie, szczególnie na coś tak ważnego jak projektowanie baz danych.

Ryathal
źródło
5
Bazy danych nie są kodem, ale schemat jest i powinien być traktowany jako taki. Powinien być także wersjonowany i kontrolowany przez źródło. Chcę to zagłosować, ale zbyt mocno zgadzam się z resztą twojej odpowiedzi.
wałek klonowy
6
Zwinne nie polega na kodowaniu. Chodzi o proces tworzenia oprogramowania, który zdecydowanie obejmuje bazy danych, jeśli działające oprogramowanie zależy od bazy danych. Powiedziawszy to, zgadzam się z twoim twierdzeniem, że Agile nie oznacza „działaj teraz, planuj później”.
Eric King,
@maple_shaft tylko dlatego, że schemat db jest traktowany jak kod, nie czyni go kodem. zwierzęta są traktowane jak ludzie, ale to nie czyni ich ludźmi
Ryathal
3
Niezależnie od tego, czy coś jest kodem, czy nie, należy to zaplanować. Zmiana bazy danych powinna być traktowana jak zmiana kodu wraz z uwagami na temat istniejących danych. W rzeczywistości wymaga to więcej myślenia i planowania.
JeffO
1

Moja ostatnia praca była w takim zespole. Podczas korzystania ze zwinnego procesu zmieniają się wymagania. Czasami zmiany oznaczają, że istniejący byt potrzebuje nowego atrybutu, co powoduje powstanie nowej kolumny w istniejącej tabeli lub wymagany jest zupełnie nowy byt, co powoduje powstanie nowej tabeli z relacjami do istniejących tabel. Tego rodzaju zmiany pochodzą z terytorium i nie można ich zignorować tylko dlatego, że nie chcesz dotykać schematu. Sukces zależy od utrzymania integralności danych podczas migracji z jednej wersji bazy danych do następnej i odpowiedniego testowania jednostkowego.

Staraj się nie wprowadzać niepotrzebnych zmian w schemacie. Na przykład, jeśli funkcja wymaga utworzenia nowej tabeli, upewnij się, że jesteś zadowolony z definicji tej tabeli, zanim ją zarejestrujesz i uruchomisz w środowisku testowym. Konieczność cofnięcia zmiany w schemacie bazy danych po migracji danych może być bolesna.

Raymond Saltrelli
źródło