# Relacje między obiektami - Przewodnik ## Spis treści 1. [Typy relacji](#typy-relacji) 2. [Relacja jeden-do-wielu (master-detail)](#relacja-jeden-do-wielu) 3. [Relacja wiele-do-wielu](#relacja-wiele-do-wielu) 4. [Relacja do interfejsu](#relacja-do-interfejsu) 5. [Historia (wersjonowanie)](#historia-wersjonowanie) 6. [Relacja zwrotna (self-reference)](#relacja-zwrotna) --- ## Typy relacji | Typ | Opis | W bazie danych | Przykład | |-----|------|----------------|----------| | Jeden-do-wielu | Dokument → Pozycje | FK (ID) | Faktura ma wiele pozycji | | Wiele-do-wielu | Przez tabelę łączącą | 2x FK | Towar ↔ Kategorie | | Interface'owa | Polimorficzna do wielu tabel | (tabela, ID) | IKontrahent → Osoba lub Firma | | Historia | Wersjonowanie temporalne | FK + okres | Ceny towaru w czasie | | Zwrotna | Do tej samej tabeli | FK (ID) | Kategoria nadrzędna | --- ## Relacja jeden-do-wielu ### Wzorzec: Dokument z pozycjami ```xml
``` ### Kluczowe atrybuty relacji podrzędnej | Atrybut | Wartość | Znaczenie | |---------|---------|-----------| | `required="true"` | | Pozycja musi mieć dokument | | `readonly="true"` | | Nie można przenosić między dokumentami | | `keyprimary="true"` | | Klucz główny zaczyna się od dokumentu | | `children="Pozycje"` | | Nazwa kolekcji w dokumencie: `dokument.Pozycje` | | `delete="cascade"` | | Usunięcie dokumentu usuwa pozycje | | `relguided="inner"` | | **Wymagane** dla tabel szczegółów (bez `guided`) | ### Zasada relguided="inner" Tabele bez atrybutu `guided` (tabele szczegółów) **muszą mieć dokładnie jedną** relację z `relguided="inner"`. Wskazuje ona obiekt główny, którego szczegóły są opisywane. ### Klucz złożony z Lp ```xml ``` --- ## Relacja wiele-do-wielu ### Wzorzec: Tabela łącząca ```xml
``` ### Wzajemne keycol Element `` w kolumnie relacji tworzy indeks złożony: ```xml ``` --- ## Relacja do interfejsu (polimorficzna) Relacja interface'owa pozwala na wskazanie obiektu z **dowolnej tabeli** implementującej dany interface. W bazie danych zapisywana jest para: `(nazwa_tabeli, ID)`. ### Deklaracja interfejsu Interface musi być zadeklarowany w business.xml. Sama definicja interfejsu (metody, właściwości) jest w kodzie C#. ```xml ``` ### Wzorzec: Relacja interface'owa ```xml
``` ### Różnica: relacja zwykła vs interface'owa | Cecha | Relacja zwykła | Relacja interface'owa | |-------|----------------|----------------------| | Typ kolumny | `NazwaTabeli` | `INazwaInterface` | | W bazie danych | tylko `ID` | `(nazwa_tabeli, ID)` | | Wskazuje na | jedną konkretną tabelę | dowolną tabelę implementującą interface | | Przykład | `type="Kontrahent"` | `type="IKontrahent"` | ### Popularne interfejsy enova365 | Interfejs | Opis | |-----------|------| | `IKontrahent` | Kontrahent (osoba/firma) | | `IPodmiotKasowy` | Podmiot kasowy | | `IRightsSource` | Źródło uprawnień | | `IElementSlownika` | Element słownika | | `IGuidedRow` | Wiersz z nawigacją | --- ## Historia (wersjonowanie) ### Wzorzec: Dane historyczne ```xml
``` ### Kluczowe atrybuty historii | Atrybut | Wartość | Znaczenie | |---------|---------|-----------| | `keyclass="History"` | | Klasa indeksu historycznego | | `keyclasscol="Okres"` | | Kolumna z okresem (FromTo) | ### Typ FromTo Wbudowany typ dla okresów czasowych z polami `From` i `To`. --- ## Relacja zwrotna ### Wzorzec: Struktura hierarchiczna ```xml
``` ### Z poziomem zagnieżdżenia ```xml ``` --- ## Wzorce złożone ### Relacja z dodatkowymi danymi ```xml
``` ### Relacja z kaskadowym usuwaniem warunkowym ```xml ```