Pełny opis struktury na diagramie klas uzyskamy gdy do klas dodamy jeszcze relacje:
Relacje służą do wiązania klas ze sobą i pozwalają w czytelny sposób opisać strukturę. Relacja generalizacji zwana czasem relacją dziedziczenia i komplementarna dla niej relacja realizacji dla interfejsów pozwalają opisać standardowe kwestie dziedziczenia atrybutów i zachowań z klas oraz interfejsów. Znacznie ciekawsze są relacje wiążące klasy w strukturę powiązanych danych: asocjacji, agregacji i kompozycji. Najmocniejsza z nich relacja kompozycji oznacza, że obiekt nadrzędny jest właścicielem obiektów podrzędnych, które są jego częściami (Rysunek 2, pozycja 2) co oznacza, że zazwyczaj odpowiada zarówno za ich utworzenie jak i usunięcie (np.: Faktura i PozycjaFaktury). Najsłabsza – relacja asocjacji – informuje jedynie o tym, że powiązanie jest (np.: Dział i Pracownik). Relacja agregacji z jednej strony oznacza, że obiekty podrzędne są częściami nadrzędnego, ale z drugiej oznacza jedynie fakt istnienia powiązania i nie nakłada na obiekt nadrzędny żadnych obowiązków. Rozróżnienie pomiędzy agregacją i asocjacją ma w dużej mierze kontekst historyczny wywodzący się z C++, gdzie istniało rozróżnienie pomiędzy przechowywaniem obiektu przez wartość (agregacja) i przez wskaźnik lub referencję (asocjacja). W nowoczesnych językach jak Java czy C# obiekty przechowywane są przez referencję i na poziomie kodu nie ma różnicy pomiędzy agregacją i asocjacją, a niektórzy eksperci sugerują wręcz rezygnację z agregacji w celu uproszczenia modelu relacji na diagramie klas.

Rysunek 2. Różne relacje istniejące na diagramie klas.