Jak zarządzać bazami danych podczas tworzenia?

Mój czteroosobowy zespół programistów od jakiegoś czasu ma do czynienia z tym problemem:

Czasami musimy pracować na tym samym zestawie danych. Więc podczas gdy rozwijamy się na naszych lokalnych komputerach, baza dev jest podłączona zdalnie.

Czasami jednak musimy uruchomić operacje na db, które nadepną na dane innych deweloperów, tzn. złamiemy skojarzenia. Do tego przydałby się lokalny db.

Czy istnieje najlepsza praktyka, aby obejść ten dylemat? Czy jest coś w rodzaju narzędzia "SCM dla danych"?

W dziwny sposób, trzymanie pliku tekstowego zapytań SQL insert/delete/update w repo git byłoby przydatne, ale myślę, że to może się bardzo powoli bardzo szybko.

Jak sobie z tym radzicie?

Author: user94154, 2010-06-28

10 answers

Moje pytanie Jak zbudować bazę danych z kontroli źródła może okazać się przydatne.

Zasadniczo skuteczne zarządzanie współdzielonymi zasobami (takimi jak baza danych) jest trudne. jest to trudne, ponieważ wymaga zrównoważenia potrzeb wielu osób, w tym innych programistów, testerów, kierowników projektów itp.

Często bardziej skuteczne jest zapewnienie poszczególnym programistom własnego środowiska sandboxowego, w którym mogą przeprowadzać rozwój i testy jednostkowe bez wpływanie na innych programistów lub testerów. Nie jest to jednak panaceum, ponieważ teraz musisz zapewnić mechanizm, który utrzyma synchronizację tych wielu oddzielnych środowisk z czasem. Musisz upewnić się, że programiści mają rozsądny sposób na zbieranie siebie nawzajem zmian (zarówno danych, schematu, jak i kodu). To wcale nie jest łatwiejsze. Dobra praktyka SCM może pomóc, ale nadal wymaga znacznego poziomu współpracy i koordynacji, aby to osiągnąć. Nie tylko to, ale także zapewnienie każdy deweloper z własną kopią całego środowiska może wprowadzić koszty przechowywania i dodatkowe zasoby DBA, aby pomóc w zarządzaniu tymi środowiskami i nadzorze nad nimi.

Oto kilka pomysłów do rozważenia:

  1. Utwórz wspólną, publiczną "tablicę środowiskową" (może być elektroniczną), na której programiści mogą łatwo zobaczyć, które Środowiska są dostępne i kto z nich korzysta.
  2. Zidentyfikuj osobę lub grupę do własnych zasobów bazy danych. Są to odpowiedzialny za śledzenie środowisk i pomoc w rozwiązywaniu sprzecznych potrzeb różnych grup (deweloperów, testerów itp.).
  3. jeśli pozwala na to czas i budżet, rozważ stworzenie środowiska sandbox dla wszystkich swoich programistów.
  4. Jeśli jeszcze tego nie zrobiłeś, rozważ oddzielenie "obszarów gry" deweloperów od środowisk integracyjnych, testowych i akceptacyjnych.
  5. upewnij się, że kontrolujesz krytyczne obiekty bazy danych - szczególnie te, które się zmieniają często jak wyzwalacze, procedury składowane i widoki. Nie chcesz stracić pracy, jeśli ktoś nadpisuje cudze zmiany.
 8
Author: LBushkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:24:37

Do testowania integracji używamy lokalnych baz danych deweloperów i pojedynczej bazy danych master. Przechowujemy Skrypty tworzenia w SCM. Jeden programista jest odpowiedzialny za aktualizację skryptów SQL opartych na schemacie "golden master". Programista może w razie potrzeby wprowadzić zmiany do swojej lokalnej bazy danych, wypełniając je w razie potrzeby z danych w integration DB, wykorzystując proces importu lub generując dane za pomocą narzędzia (w naszym przypadku Red Gate Data Generator). W razie potrzeby deweloperzy wymazują swoje lokalne w razie potrzeby można kopiować i odświeżać dane ze skryptu tworzenia i integracji. Zazwyczaj bazy danych są używane tylko do testów integracyjnych i wyklejamy je do testów jednostkowych, więc ilość pracy utrzymującej synchronizację jest zminimalizowana.

 4
Author: tvanfosson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 15:22:40

Polecam przyjrzeć się poglądom Scotta Allensa w tej sprawie. Napisał serię blogów, które moim zdaniem są doskonałe. Trzy zasady pracy z bazami danych , The Baseline , Zmień Skrypty , Views, stored procs etc , rozgałęzianie i łączenie .

Używam tych wytycznych mniej lub bardziej, ze zmianami osobistymi i działają.

 2
Author: bjorsig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 23:38:13

W przeszłości miałem do czynienia z tym na kilka sposobów.

Jednym z nich jest repozytorium skryptów SQL, które tworzy i wypełnia bazę danych. Nie jest to wcale zła opcja i może zachować wszystko w synchronizacji (nawet jeśli nie używasz tej metody, powinieneś nadal utrzymywać te skrypty, aby twój DB był pod kontrolą źródła).

Druga (którą preferuję) miała pojedynczą instancję "czystej" bazy dev na serwerze, z którą nikt się nie połączył. Kiedy programiści musieli odświeżyć swój dev bazy danych, uruchomili pakiet SSIS, który skopiował "czystą" bazę danych na ich kopię dev. Możemy wtedy modyfikować nasze dev-owe bazy danych w razie potrzeby, bez stawania na nogi innym programistom.

 0
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 15:17:46

Mamy narzędzie do obsługi bazy danych, które tworzy/aktualizuje nasze tabele i nasze proc. mamy serwer, który ma aktualną bazę danych wypełnioną danymi.

Przechowujemy lokalne bazy danych, którymi możemy grać według własnego wyboru, ale kiedy musimy wrócić do "baseline", otrzymujemy kopię zapasową "master" z serwera i przywracamy ją lokalnie.

Jeśli / kiedy dodajemy kolumny/tabele / procs aktualizujemy narzędzie dbMaintenance, które jest utrzymywane w kontroli źródła.

Sometimes, its a ból, ale działa dość dobrze.

 0
Author: Muad'Dib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 15:19:15

Jeśli używasz ORM, takiego jak nHibernate, Utwórz skrypt, który generuje zarówno schemat, jak i dane w lokalnej bazie deweloperów.

Popraw ten skrypt podczas tworzenia, aby zawierał typowe dane.

Przetestuj bazę danych przed wdrożeniem.

Wykonujemy replikację bazy produkcyjnej do bazy UAT dla użytkowników końcowych. Ta baza danych nie jest dostępna dla programistów.

Upuszczanie wszystkich tabel, tworzenie ich zajmuje mniej niż kilka sekund ponownie i wstrzyknąć dane testowe.

Jeśli używasz ORM, który generuje schemat, nie musisz utrzymywać skryptu tworzenia.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 15:22:04

Wcześniej pracowałem nad produktem, który był związany z hurtownią danych i zaprojektowany do zainstalowania w witrynach klientów w razie potrzeby. W związku z tym program wiedział, jak przejść do "instalacji" (głównie stworzenie wymaganego schematu bazy danych i populacji danych statycznych, takich jak waluty / kody krajów, itp.).

Ponieważ mieliśmy te informacje w samym kodzie i ponieważ mieliśmy wtykowe Adaptery SQL, trywialne było uruchomienie tego kodu z bazą danych w pamięci (użyliśmy HSQL). W związku z tym wykonaliśmy większość naszych rzeczywistych prac rozwojowych i testów wydajności na "prawdziwych" serwerach lokalnych (Oracle lub SQL Server), ale wszystkie testy jednostkowe i inne zautomatyzowane zadania na specyficznych dla procesów DBs w pamięci.

Mieliśmy pod tym względem szczęście, że jeśli nastąpiła zmiana scentralizowanych danych statycznych, musieliśmy uwzględnić je w części aktualizacji instrukcji instalacji, więc domyślnie były przechowywane w repozytorium SCM, sprawdzonym przez programistów i zainstalowane jako część ich normalnego przepływu pracy. Po namyśle jest to bardzo podobne do proponowanego przez Ciebie pomysłu changelog DB, z wyjątkiem trochę bardziej sformalizowanego i z warstwą abstrakcji specyficznej dla domeny.

Ten schemat działał bardzo dobrze, ponieważ Każdy mógł zbudować w pełni działający DB z aktualnymi danymi statycznymi w ciągu kilku minut, bez nadepnięcia nikomu na palce. Nie mogłem powiedzieć, czy warto, jeśli nie potrzebujesz funkcji instalacji/aktualizacji, ale ja rozważyłby to i tak, ponieważ sprawiło, że zależność od bazy danych była całkowicie bezbolesna.

 0
Author: Andrzej Doyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 15:26:22

Co z tym podejściem:

Utrzymuj oddzielny repo dla "czystego db". Repo będzie plikiem sql z tabelą creates/inserts, itd.

Używając Rails (jestem pewien, że może być dostosowany do każdego repo git), utrzymuj "clean db" jako podmoduł w aplikacji. Napisz skrypt (być może zadanie rake), który odpycha lokalny dev db za pomocą instrukcji SQL.

Aby wyczyścić lokalny db (i zastąpić świeżymi danymi):

git submodule init
git submodule update

Then

rake dev_db:update ......... (or something like that!)
 0
Author: user94154,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 16:11:29

Zrobiłem jedną z dwóch rzeczy. W obu przypadkach programiści pracujący nad kodem, który może kolidować z innymi, uruchamiają własną bazę danych lokalnie lub uzyskują osobną instancję na serwerze bazy danych dev.

  • Podobnie jak polecam @tvanfosson, masz zestaw skryptów SQL, które mogą budować bazę danych od podstaw, lub

  • Na Dobrze zdefiniowanych, regularnych zasadach wszystkie bazy danych programistów są nadpisywane kopią danych produkcyjnych lub ze skalowaniem down / deidentifiked kopii produkcji, w zależności od rodzaju danych używamy.

 0
Author: Dean J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-28 16:16:59

Zgadzam się z tym wszystkim, co powiedział w swojej odpowiedzi. Jeśli używasz SQL Server, mamy rozwiązanie tutaj w Red Gate, które powinno umożliwić łatwe udostępnianie zmian między wieloma środowiskami programistycznymi.

Http://www.red-gate.com/products/sql_source_control/index.htm

Jeśli istnieją problemy z pamięcią masową, które utrudniają dba zezwalanie na wiele środowisk programistycznych, Red Gate ma na to rozwiązanie. Dzięki technologii HyperBac Red Gate możesz tworzenie wirtualnych baz danych dla każdego dewelopera. Wydają się być dokładnie takie same jak zwykła baza danych, ale w tle wspólne dane są współdzielone między różnymi bazami danych. Pozwala to programistom na posiadanie własnych baz danych bez zajmowania niepraktycznej ilości miejsca na serwerze SQL.

 0
Author: David Atkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-03 11:14:57