2009-04-17 11 views
5

W kodzie zazwyczaj łatwo dodawać nowe klasy, aby zapewnić dodatkową funkcjonalność i tym podobne. Mam dość dobre zrozumienie kodu refaktoryzacji i to, co jest w nim zawarte, ogólnie ma dla mnie sens.Czy YAGNI ma zastosowanie do projektowania baz danych?

Nie jestem zaznajomiony z obsługą i aktualizowaniem relacyjnej bazy danych po jej wdrożeniu. Pracuję nad małym projektem dla zwierząt domowych, który mam zamiar ćwiczyć Release Early, Release Often i zastanawiam się, czy powinienem wziąć pod uwagę dane, które nie będą używane w początkowej wersji, ale są na liście planowanych funkcji? Czy dodawanie tabel i dostosowywanie schematów jest tak proste, jak dodawanie nowych klas? Czy powinienem spróbować ustawić tabele dla rzeczy, które mogłem wykorzystać, ale które nie planują w najbliższej przyszłości?

Odpowiedz

2

Jeśli masz dobre testy, które trafiają do bazy danych, chciałbym rozszerzyć YAGNI do projektu bazy danych.

Ogólnie rzecz biorąc, łatwo jest dodawać kolumny i tabele, a mniej łatwo je usunąć lub znacznie zmodyfikować. Weź to pod uwagę podczas projektowania tabel (tzn. Jeśli klient może mieć wielu użytkowników, nie dodawaj identyfikatora użytkownika do tabeli klientów.) Wykonuj to poprawnie za pierwszym razem).

+0

Co, jeśli odwrócisz to: powiedz, że specyfikacja klienta jest obecnie tylko dla jednego wykonawcy na czas trwania trasy koncertowej, ale w przyszłości dwa z ich zespołów mogą wyruszyć w trasę razem, grając w te same programy. Czy nadal dodajesz artist_id do tabeli z datami zwiedzania, ograniczając system do 1 artysty na turę? A może myślisz o przyszłości, czyniąc ją relacją HaBtM? – Calvin

2

Moja opinia jest taka, że ​​YAGNI stosuje się do wszystkiego, kodowania, projektowania baz danych, pracy w domu (moja żona nie zgadza się ze mną na ten temat gwałtownie) i tak dalej.

Każda aplikacja oparta na systemie DBMS, nad którą kiedykolwiek pracowałem, regularnie aktualizowała się do scema, więc powinno to być zaplanowane w procesach. Administratorzy DBA nie będą lubić "wydawać często" części twojej propozycji, ponieważ to więcej pracy dla nich (lub ciebie, jeśli to jest baza danych innych niż DBA).

Ale po to tam są.

3

To jest doskonałe pytanie. Osobiście odkryłem, że modyfikowanie schematu bazy danych i przekształcanie wszystkich danych w nową reprezentację jest znacznie trudniejsze niż refaktoryzacja kodu. Tak bardzo, że gdy tylko rozpoczynam projekt, który będzie korzystał z nowej bazy danych, zawsze potrzebuję czasu zanim usiądę i piszę dowolny kod, aby uzyskać jak najdokładniejszy opis. Często wiąże się to z przewidywaniem funkcji i włączaniem ich obsługi do bazy danych, nawet jeśli nie planuję ich natychmiastowego wdrożenia.

Możesz być trochę bardziej zwinny przy refaktoryzacji bazy danych, jeśli używasz frameworka lub innej podobnej warstwy, która zapewnia mechanizm zmiany bazy danych, ale jeśli piszesz prosty SQL, to polecałbym inwestować skromna ilość czasu na zaprojektowanie i wdrożenie schematu, który jest mniej prawdopodobny i wymaga zmiany w przyszłości.

+0

To prawda, że ​​refaktoryzacja baz danych jest trudniejsza. Z drugiej strony, stwierdziłem również, że praca z nieelastycznymi bazami danych zaprojektowanymi z przodu staje się ogromnym czasem. Baza danych nie odzwierciedla właściwie wymagań lub jest znacznie bardziej skomplikowana niż to konieczne, więc dostęp do niej staje się trudny. – jalf

+0

Prawda. Zasadniczo założyłem, że projektant bazy danych i programista to ta sama osoba i ta osoba jest w stanie zaprojektować dobrą specyfikację db. Zaktualizuję moją odpowiedź, aby była jaśniejsza. –

0

Zasada nadal obowiązuje. Nie będziesz musiał martwić się dodawaniem pól do tabel itp., Dopóki nie będziesz miał dużej ilości danych. Dość dużo danych. Martwienie się zbyt wcześnie o szczegóły indeksowania i planów zapytań bez oglądania rzeczywistych danych często będzie zmarnowanym czasem, a nawet doprowadzi do problemów architektonicznych później.

Niestety, fałszowanie projektu bazy danych po wydaniu produkcyjnym może być dość przerażające, jeśli nie zostanie zastosowany dobry proces testowania/zwolnienia. Więc nawet bardziej niż kod, chcesz uzyskać to dobrze za pierwszym razem z bazą danych.

W przypadku baz danych, chcesz planować uzyskiwanie danych, jak również umieszczanie ich i przechowywanie, więc jeśli twoje "planowane" funkcje obejmują raportowanie, to będzie to miało duży wpływ na projekt bazy danych, więc może Zaplanuj to.

Nie jest tak proste modyfikowanie schematu, jak dodawanie klasy, ale jest to wykonalne.

W sumie YAGNI nadal obowiązuje.

0

Nie ustawiaj stołów, których jeszcze nie potrzebujesz. Jedną z przyczyn YAGNI jest to, że nie przewidziesz z góry odpowiednich rzeczy, których będziesz potrzebować. Możesz łatwo dodawać nowe tabele, zmieniać istniejące tabele itd., Gdy musisz je zmienić.

Dobra struktura powinna mieć kilka narzędzi do wykonania migrations, które pozwalają na łatwe i automatyczne uaktualnienie i obniżenie bazy danych. Jeśli masz to na miejscu i rozsądnie traktujesz swój projekt, powinieneś być w stanie refaktoryzować swoją drogę tam, gdzie chcesz, zamiast próbować wymyślić wszystko, co kiedykolwiek będziesz potrzebował.

2

Istnieje cały szereg zwinnego myślenia o projektowaniu i wdrażaniu bazy danych. Możesz być zainteresowany przeglądając best practices pod www.agiledata.org dla niektórych myśli Scotta Amblera na ten temat. Dla siebie ogólnie pozwalam na rozwój projektu bazy danych wraz z rozwojem aplikacji. Rzadko tworzę tabele z wyprzedzeniem. Wyjątkiem są takie rzeczy jak audyt i pozwolenia, rzeczy, które przecinają cały projekt. Zastanowię się, jak zaimplementować te rzeczy, nawet jeśli faktycznie nie stworzyłem dla nich żadnych tabel. Przekrojowe aspekty mają wpływ na projektowanie tabel, nawet jeśli te funkcje nie zawsze są pierwszymi z bramek.

0

Projektowanie bazy danych jest jak każdy inny rodzaj projektu. Twoje zrozumienie rośnie stopniowo, a wraz z lepszym zrozumieniem pojawia się rozwijający się schemat.

Chciałbym, aby łatwiej było wyjaśnić, w jaki sposób istnieje konceptualna podstawa projektowania schematu bazy danych relacyjnych. Jedynym narzędziem, które tak naprawdę modeluje to jest Object Role Modeling, który od dawna wyłania się. Najbardziej znanym narzędziem był Visiomodeler. Aby uzyskać jego smak, oto kilka linków do Scott Ambler i Scot Becker Ale wniosek, który można wyciągnąć, to to, że asercje typu modelowania obiektowego prowadzą bezpośrednio do określonego relacyjnego modelu logicznego; dlatego schemat będzie musiał ulec zmianie, gdy zmieni się model koncepcyjny.

W praktyce twoje rdbms może poradzić sobie z dość dużym zginaniem, jeśli naprawdę czujesz się komfortowo z wyrażeniami transformacji; i warto to poprawić.

Uwaga: Myślę, że techniki unikania SQL, takie jak LINQ i modele relacyjno-obiektowe, będą jedynie przeszkodą dla zmieniającego się projektu. Mogę się mylić. Jest jakiś powód, by mieć nadzieję, że Microsoft Entity Framework będzie obejmował Object Role Modeling; ale widziałem tylko skośne odniesienia do tej możliwości.

1

Istnieje konceptualna podstawa do projektowania baz danych.

W klasycznym projekcie bazy danych istnieją trzy modele: koncepcyjny, logiczny i fizyczny.

Model koncepcyjny wyłania się z analizy wymagań i ewoluuje wraz z ewolucją leżącego u jego podstaw przedmiotu lub zmienia się rozumienie przedmiotu. Model pojęciowy przypisuje elementarne dane do formy i semantyki, ale nie zajmuje się takimi zagadnieniami, jak skład tabeli.

Model logiczny wykorzystuje relacyjny model danych. Można go wyprowadzić z modelu pojęciowego, ale dotyczy również składu relacji. Występują tutaj normalizacja i inne kwestie dotyczące kompozycji. Model logiczny przewiduje projektowanie tabeli, a także kwerendy i aktualizacje aplikacji.

Model fizyczny implementuje relacje jako tabele, a także dodaje wszystkie inne funkcje, takie jak indeksy, obszary tabel itp.potrzebne do zbudowania bazy danych. Pochodzi z modelu logicznego, ale w grę wchodzą: objętość danych, obciążenie, wydajność i przestrzeń dyskowa.

To brzmi długotrwale i nużąco, ale w rzeczywistości jest szybkie, jeśli wiesz, jak to zrobić. Całość można zrobić w ciągu kilku tygodni, podczas gdy reszta zespołu wciąż debatuje nad funkcjonalnymi specyfikacjami. Dla naprawdę małego projektu (6 tabel, 50 kolumn) można to zrobić w kilka dni, za pomocą tylko ołówka i papieru. W przypadku większych projektów istnieją narzędzia, które sprawiają, że projektowanie staje się bardziej automatyczne, mniej podatne na błędy i łatwe do przedstawienia.

Ale co się stanie, gdy odkryjesz, że model koncepcyjny był niedokładny lub niekompletny, a pozostałe dwa modele i sama baza danych muszą zostać zmienione? To tutaj przybywa na ratunek Data Independence. Niezależność danych polega na projektowaniu bazy danych, co oznacza enkapsulacja dla projektu obiektu. Mianowicie zapobiega to rozprzestrzenianiu się drobnego dopasowania w jednym miejscu na obiektach aplikacji. Obiekty zależą tylko od danych, z których korzystają.

Jeśli do schematu ma zostać dodana nowa tabela, szanse, że jakaś aplikacja zostanie zerwana, są znikome. Nawet jeśli istniejąca tabela musi zostać zmieniona, zapytania korzystające tylko ze starych kolumn nie będą miały żadnej różnicy. Nawet jeśli obiekty są zależne od zmiany, nadal możesz nadać zmienionej tabeli nową nazwę, a następnie utworzyć widok ze starą nazwą, która sprawia, że ​​wygląda tak, jak stary stół.

Niezależność danych fizycznych jest prawie kompletna w dobrym DBMS. Możesz reorganizować dane, dodawać i upuszczać indeksy itp. I nie powinieneś zmieniać żadnej aplikacji.

Podsumowując, zarządzanie zmianami może być wykonane doskonale przy użyciu naprawdę dobrych produktów DBMS. Niestety, wielu administratorów i programistów nie wie, jak w odpowiedni sposób korzystać z tych funkcji DBMS, mimo że istnieją one od lat.

Powiązane problemy