Wpis z mikrobloga

Powoli w #pracbaza szykuję się do projektu WiP (W-------l i Postaw).

Chodzi o kompletne zaoranie bazy #sql ( #mssql ), która jest kompletnie nieznormalizowana (ok. 250 tabel, z czego większość śmieciowych, a ważne też są powalone, w praktyce zero PK, a tym bardziej FK czy indeksów) i postawienie jej od nowa, ze znomralizowanymi tabelami. Mam do tego celu serwer testowy, na którym mogę robić wszystko (procedury, SSIS, SSRS) bez obawy o zepsucie czegoś, co na razie działa na tym "potworku". O ile schemat sobie powoli rysuję i ogarniam 1NF, 2NF, 3NF, (...) tak pojawia się pytanie jak dobrze rozegrać jeden z problemów.

Przyjmijmy, że mam tabelę ze wszystkimi zamówieniami stworzonymi przez klientów. Numer klienta jest schowany pod ID z tabeli, przyjmijmy, dbo.CustomerMaster, które jest FK z przytoczonej wcześniej tabeli (ID to PK IDENTITY w CustomerMaster). Więc, żeby wiersz miał sens, klient musi mieć swój odnośnik w tabeli CustomerMaster. Klientów rozróżniamy pod numerem i krajem pochodzenia (ten sam numer może być przypisany do innego kraju i być kompletnie innym klientem). I teraz pytanie jak dobrze rozegrać wrzucanie danych do tabeli z zamówieniami. Dane są brane z zewnętrznego serwera ERP.

Mój pomysł, którego nawet nie próbowałem jeszcze, tylko istnieje w głowie:
1. Pobranie nowych zamówień do tabeli dbo.StagCustomerOrders
2. Sprawdzenie czy wiersze z kolumn CustomerNo i Country mają swoje odpowiedniki w CustomerMaster.
3a. Jeśli mają, wrzucaj dane do dbo.CustomerOrders, z ID zamiast kolumn CustomerNo i Country.
3b. Jeśli nie mają to... puszczaj SELECTa z takimi wierszami i pobieraj do CustomerMaster dane dla nich z zewnętrznego serwera ERP i dopiero potem wrzucaj linie zamówień do CustomerOrders we własnej bazie (?)

Pytaniem jest, czy punkt 3b. jest poprawnym rozwiązaniem czy można (trzeba?) to inaczej zrobić? A może cały pomysł jest o kant rzyci rozbić i powinienem się wstydzić?

Nie chcę pobierać za każdym razem całej tabeli bo to są miliony wierszy i obciążenie dla zewnętrznego serwera ERP. Plus zależy mi na prędkości ( ͡° ͜ʖ ͡°)

#naukaprogramowania #kiciochpyta #bazydanych
  • 17
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@AwizisieAkat: mamy tabelę, jedną, wielką, z toną wierszy, która ma dane nt. klienta, zamówienia, ilości, itd. ale np. nie ma nic żeby połączyć tego klienta z czymś.

Chcę na razie osiągnąć coś takiego jak w obrazku.

Dane są pobierane z zewnętrznego serwera, gdzie są osobne tabele do klientów i osobne do zamówień, ale nie mają unikalnych kluczy jednokolumnowych, tylko można je łączyć właśnie po numerze klienta i kraju.

PS. Tak,
DarkAlchemy - @AwizisieAkat: mamy tabelę, jedną, wielką, z toną wierszy, która ma dan...

źródło: comment_tYRYPDtIpugvdJlNI6mucN0Dy6A6HUrm.jpg

Pobierz
  • Odpowiedz
@AwizisieAkat: tutaj się pojawia pytanie takie:
https://www.wykop.pl/wpis/29213361/

Jak działa OPENROWSET na łączeniach pomiędzy bazami?

Jeśli dobrze rozumiem Twój pomysł, to najpierw sprawdzam jakie są nowe zamówienia na zewnętrznym serwerze, próbuję połączyć to z moją lokalną tabelą klientów i jeśli czegoś nie ma, to najpierw pobieram brakujące dane z zewnętrznego serwera do tabeli Master, a potem pobieram jeszcze raz zamówienia do tabeli Orders?
  • Odpowiedz
@kodyak: czyli po stronie serwera zewnętrznego łączyć już tabelę z zamówieniami i danymi klientów, pobierać jako całość i potem sobie rozdzielać jak mi się podoba?

Może głupie pytania, ale ciągle się uczę, jak pewnie każdy, i lepiej dopytać niż zrobić źle ()
  • Odpowiedz
@DarkAlchemy: Model "w-------l i postaw" się nie sprawdza chyba że masz aplikację w fazie testowej. Weź to normalnie, po ludzku, stopniowo modyfikuj bo inaczej okaże się że za 3 miesiące czas się skończy a ty nie będziesz miał nic co można zdeployować.
  • Odpowiedz
@plushy: taki jest zamysł, żeby to stopniowo robić na serwerze testowym, sprawdzać rzeczy, które działają na produkcji na teście, itd. Czas jest do końca roku, więc powinno się udać
  • Odpowiedz
@DarkAlchemy: tak. Czasami mozna zrobic nawet wiecej tabel przejsciowych filtrow itd ale to jest dosc proste wiec nie ma potrzeby.
Nie wiem jak duza jest tabela ktora chcesz sciagac i czy chcesz sciagac przyrsot czy cala tabele? Tez zalezy ile razy dziennie ma to by replikowane itd
  • Odpowiedz
@kodyak: tabela ma kilka milionów wierszy tylko w skali roku, a sama początki ma chyba w latach 80-90 ;)

Ogólnie raz chcę ściągnąć za ostatnie trzy lata, a potem tylko dorzucać nowe wiersze, lub te co się zmieniły (w tabeli źródłowej są odpowiednie kolumny z datami stworzenia i zmiany)
  • Odpowiedz
@DarkAlchemy: Teraz jest czas do końca roku ale co będzie za 3 miesiące? Albo co jeśli przyjdzie dzień wielkiego release'u i się okaże że nowa wersja pieprzła po całości? Wprowadzaj zmiany w możliwie małych inkrementacjach, nawet jeśli jakiś kod będzie zdeployowany z planem zaorania go za miesiąc to nadel jest progres. Czasy gdy nową wersję aplikacji wypuszczało się raz w roku są słusznie minione.
  • Odpowiedz
@plushy: akurat projekt jest tylko i wyłącznie mój, nikt mi żadnych terminów nie narzuca, a po prostu do końca roku musi pójść update silnika bazy danych, który można by zrobić od razu, ale czemu, skoro można najpierw zupdatować test, tam stworzyć nową logikę i potem puścić wszystko na raz? A jak się nie wyrobię to pójdzie sam update silnika, podmiana kilku raportów na SSRS i dalej działa.

@kodyak:
  • Odpowiedz
@DarkAlchemy: Projekt jest pracowy czyli nie twój, jak PM uzna że się przydasz gdzie indziej to tygodnie pracy pójdą w p---u. Oczywiście w sytuacji gdy projekt jest u klienta i nie można robić deployu co tydzień to rozumiem, ale w innych to jednak trzymaj się continous delivery.
  • Odpowiedz