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 ( ͡°͜ʖ͡°)
@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.
@DarkAlchemy: chyba dalej nie rozumiem problemu, bo nie rozumiem po co tutaj tabela na tymczasowe dane, nie lepiej sobie to posprawdzać i wrzucić na raz?
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?
@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 (。◕‿‿◕。)
@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ć.
@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ć
@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
@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)
@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.
@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.
@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.
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
Ale chętnie się dowiem jak byś to widział :)
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,
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?
Może głupie pytania, ale ciągle się uczę, jak pewnie każdy, i lepiej dopytać niż zrobić źle (。◕‿‿◕。)
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
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)
@kodyak: