Schematy danych i ich ewolucja
1) Dlaczego jest to platforma iGaming
Niezawodność - Zmiany danych nie łamią raportów, interfejsów API ani modeli.
Szybkość funkcji: bezpiecznie dodawać pola (KYC/RG/PSP) bez zatrzymywania strumieni.
Regulacja: identyfikowalność i odtwarzalność (audyt/rodowód, DSAR, Legal Hold).
Koszt: zminimalizować „przepełnienia” i przestoje zasypek.
2) Rodzaje programów i miejsca ich zamieszkania
Zdarzenia (strumienie): "płatności. deposit_accepted', gra. round_finished'.
OLTP/DDL: znormalizowane tabele (KYC, konta, limity).
DWH/sklepy (Złoto): denormalizowane kruszywa według BI/ML.
Sklep funkcyjny: zestawy funkcji online/offline z gwarancjami spójności.
Umowy z partnerami zewnętrznymi: PSP, dostawcy gier, źródła marketingowe.
Zapisy: Avro/Protobuf (strumienie), JSON Schema (integracje), SQL DDL (DWH), Schemat parkietu (jezioro).
3) Zgodność (rdzeń ewolucji)
Kompatybilność wsteczna: nowi producenci → starzy konsumenci (dodane pole c domyślnie/nieważne).
Do przodu kompatybilne: starzy producenci → nowi konsumenci (nowy czytelnik ignoruje zbędne).
W pełni kompatybilne: oba (pożądany cel dla wydarzeń).
Zmiany: zmiana nazwy/usunięcie pola, zmiana typu/semantyki, zmiana klucza/partycji.
Zasada 1: wydarzenia ewoluują poprzez dodawanie, a nie poprzez zmianę.
Zasada 2: skreślić - tylko w wersji MAJOR programu po okresie deprecate.
4) Wersje semantyczne i polityki
"MAJOR. DROBNE. PATCH 'dla każdego zestawu schematów/prezentacji/funkcji.
MAJOR - niezgodny (nowy temat/tabela/zestaw funkcji, podwójny uruchom).
MINOR - kompatybilny (nowe nieważne/domyślne pola, nowe wartości enum).
PATCH - edytuj opisy/limity/komentarze.
Cykl życia w terenie: „eksperymentalny → aktywny → przestarzały → usunięty” (z datami i właścicielem).
5) Rejestr systemu i umowy o dane
Schema Registry: przechowuje wersje, kompatybilność, ewolucję i właścicieli.
Umowa o dane: ustala system + jakość SLO + prywatność (patrz sekcja „Walidacja danych”).
json
{
"type":"record","name":"deposit_accepted","namespace":"payments",
"fields":[
{"name":"event_id","type":"string"},
{"name":"occurred_at","type":{"type":"long","logicalType":"timestamp-micros"}},
{"name":"user_id","type":"string"},
{"name":"brand","type":"string"},
{"name":"country","type":"string"},
{"name":"psp","type":"string"},
{"name":"method","type":"string"},
{"name":"amount","type":{"type":"bytes","logicalType":"decimal","precision":18,"scale":2}},
{"name":"currency","type":{"type":"enum","name":"Currency","symbols":["EUR","USD","TRY","BRL"]}},
{"name":"risk_score","type":["null","int"],"default":null}, // MINOR+
{"name":"kyc_level","type":["null",{"type":"enum","name":"Kyc","symbols":["L0","L1","L2","L3"]}],"default":null}
],
"compatibility":"FULL","owner":"team-payments"
}
6) Wzory migracji
6. 1 Wydarzenia (strumienie)
Tylko dodatek: dodaj pola z domyślnym/nieważnym; Starzy konsumenci nie łamią.
Rozszerzenie enum: nowe znaki są uważane za MINOR, konsumenci są zobowiązani do posiadania 'innej/nieznanej' gałęzi.
WAŻNIEJSZA migracja: nowy temat "płatności. deposit_accepted. v2 ', podwójne pisanie, odczyt cieni, a następnie zmiana konsumentów.
6. 2 DWH/sklepy
Niebiesko-zielone stoły: 'złoto. revenue_v2' obok „v1”; materializować, weryfikować, przełączać BI.
Backfill: replay by snapshots + idempotent merge (według klawiszy/wersji).
SCD: typ 2 dla powoli zmieniających się atrybutów (limity, KYC, statusy VIP).
6. 3 Funkcja Sklep
Podwójna obsługa: stary zestaw funkcji jest serwowany równolegle do nowego; model jest obsługiwany przez router.
Spójność w czasie: ewolucja nie powinna łamać radości PITA (znacznik czasowy/ziarnistość są niezmienione w MINOR).
7) Taksonomia zmian (lista kontrolna)
Bezpieczne (MINOR):- dodanie pola „nieważne/domyślne”;
- rozszerzenie enum (z „nieznanym” oddziałem u konsumenta);
- dodanie indeksu/komentarza/opisu bez klucza.
- Zmiana skali/jednostki (na przykład kwota w centach → waluta bazowa) - tylko MAJOR
- transfer odniesienia/odniesienia - poprzez warstwę prezentacji.
- Zmień nazwę/usuń pole
- Zmień typ/format/klucz/partycja
- zmiana semantyki (na przykład 'bonus _ amount' z 'accrued' → 'written off').
8) Lintery obwodów i testy kompatybilności
Schema-lint: styl nazwy ('snake _ case'), wymagane etykiety ('owner', 'doc',' pii '), format daty/waluty.
Testy kompatybilne: sprawdzanie nowej wersji w rejestrze (do tyłu/do przodu/do końca).
Testy konsumenckie: każda usługa zapewnia „przykładowy ładunek” i oczekiwania; uruchomić na CI podczas zmiany schematu.
Złote zbiory danych: zbiór prawdziwych i „złych” przykładów (nowe enum, puste/późne pola, wartości graniczne sum).
9) Katalogi, enum i lokalizacja
Dane referencyjne (kraje/waluty/PSP/dostawcy): poszczególne wersje i aktualizacje SLA; nie szyć kodu zdarzenia.
Lokalizacja/strefy czasowe: przechowywać UTC w zdarzeniach + wyraźny lokalizator do prezentacji.
Zasady jurysdykcji: flagi wiekowe, ograniczenia promocyjne - w formie katalogów z datami działania.
10) Multi-Brand/Multi-Jurisdiction i PII
Izolacja najemcy: „marka”, „kraj”, „licencja” - obowiązkowe pola z enum; jadąc na nich.
Polityka PII na poziomie schematu: zaznacz pola „pii = true”, zastosuj maski/tokenizację; w wydarzeniach, tylko żetony.
DSAR: obecność 'source _ id/trace _ id' for deletion/retrieval; Legalne wstrzymanie migracji MAJOR.
11) DDL i Lake versioning
Migracje DDL: migracje deklaracyjne (Liquibase/Flyway/dbt), przechowywanie w VCS, przegląd przez właściciela domeny.
Formaty w jeziorze: Avro/Parquet - zapisz ewolucję pól; na MAJOR - nowa tabela/ścieżka '.../v2/'.
Partytura: części zmieniające (na przykład „data” → „data, marka”) - tylko przez MAJOR i podwójny wpis.
12) Przykłady iGaming
12. 1 Metody rozszerzone PSP
Dodano 'metoda = „MEFETE”' do enum.
MINOR release of the 'deposit _ accepted v1. 8. 0`; konsumenci, którzy nie znają MEFETE, wysyłają oddział do „nieznanej metody _”.
12. 2 Dostawca gier dodane boiska
V 'game. round_finished' dodane 'jackpot _ id' (nieważne).
Pokaż złoto. game_rounds_v3' otrzymuje MINOR; Stare raporty działają, nowe liczą jackpoty.
12. 3 atrybuty RG
Przejście z booleańskiego „self _ excluded” na status „rg _ state” {brak, limit, cooldown, self_excluded}' - MAJOR, nowy temat + podwójne zapisy + migracja prezentacji i modeli.
13) Proces ewolucji (od pomysłu do przełączania)
1. Wniosek (ADR): dlaczego zmiana, rodzaj zgodności, ocena ryzyka i wpływ na konsumentów.
2. Projekt i kontrakt: system rejestracji, semver, polityka zgodności.
3. Testy: linters, compat, consumer-contracts, replay on golden-sets.
4. Wdrożenie: podwójne pisanie/niebiesko-zielone/odczyt cieni; wpisy.
5. Pojednanie: Salda biznesowe/niezmienne (zob. walidacja danych).
6. Przełącznik: przełącznik konsumentów/BI/funkcje.
7. Deprecate: zamrozić stary schemat, okres grace, usunąć i archiwum.
14) Metryki i SLO ewolucji
Szybkość migracji sukcesu, czas podwójnego działania, udział nowych wydarzeń formatu, objętość zasypki, opóźnienie/świeżość.
Incydenty kompatybilności (P1/P2), jakość okna po przełączaniu.
Koszt: przelew $/TB, $/godzinę podwójnego zapisu, obciążenie klastra.
Zgodność: 0 wycieków PII, SLA DSAR/Legal Hold Met.
15) Narzędzia i artefakty
15. 1 Polityka zgodności (rejestr)
yaml schema: payments. deposit_accepted compatibility: FULL default_nulls: true enums:
currency: {allow_new_symbols: true, require_consumer_unknown_branch: true}
pii: false owners: ["team-payments"]
reviewers: ["data-governance","security-dpo"]
15. 2 Paszport migracji (szablon)
yaml change_id: MIG-2025-041 scope: game. round_finished -> v3 type: MAJOR plan:
dual_write: true shadow_reads: consumers: ["gold-rounds","rg-models"]
backfill: {from: "2025-01-01", mode: "idempotent-merge"}
validation:
invariants: ["sum_bets = sum_wins + margin + bonuses"]
freshness_delta_p95_max: "PT5M"
switch_criteria:
error_rate_max: 0. 1%
kpi_diff_pp_max: 0. 5 deprecate_after: "2025-12-31"
15. 3 Linter nazw i typów (zasady)
„sake _ case”, znaczniki czasowe UTC, DECIMAL (18. 2) dla sum, „kraj” dla ISO-3166-1 alfa-2, „waluta” dla ISO-4217.
Nie 'free _ text' dla pól enum; książki referencyjne - zewnętrzne.
16) Plan działania w zakresie wdrażania
0-30 dni (MVP)
1. Włącz politykę kompatybilności rejestru schematów + dla kluczowych zdarzeń (płatności, game_rounds, użytkownik).
2. Badania liniowe/kompat w CI; katalog właściciela i opinie SLA.
3. szablony ADR i paszport migracji; Lista kontrolna majora.
30-90 dni
1. Niebiesko-zielone dla złotych sklepów; dual-write dla krytycznych tematów.
2. testy konsumenckie na podstawowe usługi; złote zbiory danych.
3. Automatyczne uzgodnienia różnicowe i wpisy podczas przełączania; raporty kosztów.
3-6 miesięcy
1. Pojedynczy proces deprecate/remove z grace-okres; archiwizacja i prawna blokada.
2. Schematy i klucze szyfrowania specyficzne dla geo/najemcy; Warianty DP dla rynków wrażliwych.
3. Słownik danych i wykresy na żywo.
17) RACI
Zarządzanie danymi (A/R): normy, rejestr, przegląd migracji, rezygnacja z publikacji.
Właściciele domen (R): znaczenie pól, książek referencyjnych, niezmiennych przedsiębiorstw.
Platforma danych (R): narzędzia rejestru, testy kompat, podwójne/zasypki.
Bezpieczeństwo/DPO (A/R): polityka PII, geo/najemca, DSAR/Legal Hold.
SRE/Observability (C): alerty, evolution SLO, capacity.
Produkt/Finanse (C): walidacja KPI, przełączanie okien.
18) Anty-wzory
„Edytuj pole na muchę” bez wersji i podwójnego biegu.
Zmiana nazwy zamiast dodawania nowego pola → ogromne podziały.
Twardy enum bez 'nieznanej' gałęzi → spadek o nowe wartości.
Pojedynczy katalog „w kodzie” dla wszystkich jurysdykcji.
Zasypka bez idempotent-fuzji i sprawdzić salda.
Dzienniki z PII i bez trace_id do wyszukiwania/DSAR.
19) Sekcje powiązane
Walidacja danych, Pochodzenie danych i ścieżka, Praktyki w zakresie OPS, Analityka i Metryka API, Audyt i Wersioning, Bezpieczeństwo danych i szyfrowanie, Kontrola dostępu, MLOp: Wykorzystanie modelu.
Razem
Ewolucja systemów jest procesem, a nie jednorazową migracją: rejestr, wersje i interoperacyjność; podwójny i niebieskozielony zamiast „przełączników o północy”; testy kompatybilności i niezmienne firmy zamiast szczęścia. Więc dane pozostają stabilne, modele są przewidywalne, raporty są poprawne, a regulatory są spokojne.