Objektdatabase

En **objektdatabase** er en database som bygger på prinsippet om objektorientering. I objektdatabaser organiseres informasjon i objekter som står toveis relasjoner til hverandre. Objekter er organisert i klasser, og man bruker strukturer som subklasser og interface, på samme måte som i objektorientert programmering. I en objektdatabase ønsker man å kunne bruke metodene fra objektorientert programmering, men sette disse inn i et system som ivaretar kravene til en database. Databasehåndteringssystemer for objektdatabaser kalles ODBMS (Object Database Managment System).

Objektdatabaser brukes gjerne når komplekse data skal behandles med høy ytelse.

## Standardisering
Object Database Management Group (ODMG) ble stiftet i 1991 og utarbeidet en viktig standard for objektdatabaser med utgangspunkt i standarder fra Object Managment Group (OMG). Bakgrunnen for dette var at de ønsket en mindre strikt standard som enklere kunne implementeres. Mellom 1993 og 2001 utgav de en spesifikasjon og fem revideringer av denne. Siste versjon var ODMG 3.0. Gruppen ble så oppløst.

I 2006 ble rettighetene til standarden overført til OMG. OMG er en viktig standardfastsetteren innenfor objektorientering, som ble stiftet i 1989 av 11 større dataselskaper. For å ivareta det videre arbeidet har de stiftet Object Database Technology Working Group (ODBT WG).

## ODMG-standarden
ODMGs standard består av:
***Object Definition Language (ODL)** som brukes til å definere klasser
***Object Interchange Format (OIF)** som er et format for å skrive og lese objekter til filer
***Object Query Language (OQL)** som er et spørrespråk som ligner på SQL, men som arbeider med objektdatabaser.
*Språkbindinger for Smalltalk, C++ og Java

## Object Definition Language (ODL)
Et eksempel på definisjon av en klasse i ODL:


```java
class Student : Person (extent studenter keys (navn, alder)) {
   attribute string navn;
   attribute integer alder;
   attribute Struct Stud {
      string institusjon,
      string fag
      } studie;
}
```


Denne definisjonen oppretter klassen Student, som implementerer interfacet Person. Mengden av Student kalles studenter og studenter identifiseres med navn og alder. Navn og alder er definert direkte. Studie defineres som en egen struktur som heter Stud. I klassen student brukes betegnelsen "studie". Årsaken til at det gjøres slik er at man da kan gjenbruke strukturen i en annen sammenheng/klasse. Strukturen får pekeren Student::Stud.

Eksempel på deklarasjon av en-til-en-assosiasjon. Det må være en korresponderende deklarasjon i klassen det henvises til, Mobil::eiesAv er en lenke til denne deklarasjonen.


```java
class Student {
  relationship Mobil eier inverse Mobil::eiesAv;
}
```



```java
class Mobil {
  relationship Student eiesAv inverse Student::eier;
}
```


Eksempel på deklarasjon av en mange-til-en assosiasjon i ODL. Her har arbeidgruppe et sett av studenter og hver student deltar i en arbeidsgruppe:


```java
class Arbeidsgruppe {
  relationship Set<Student> harDeltager inverse Student::deltarI;
}
```



```java
class Student {
  relationship Arbeidsgruppe deltarI inverse Arbeidsgruppe::harDeltager;
}
```


Mange-til-mange-relasjoner uttrykkes som to en-til-mange assosiasjoner.

Klasser i objektdatabaser kan også inneholde metoder, på samme måte som i objektorienterte programmeringsspråk, og slike brukes for å endre verdiene i objekter.

## Object Query Language (OQL)
OQL er laget for å kjøre spørringer mot en objektdatabase, og brukes alltid innenfor et vertsspråk. OQL refererer alltid til ekstensjoner, og ikke til klasser. I motsetning til SQL har ikke OQL en egen update-funksjon, men objekter kan endres ved å kalle metoder i objektene. I OQL navigerer man ofte ved hjelp av stier.

Eksempel på spørring i OQL, med utgangspunkt i tidligere eksempler. Finn navn og nummer til studenter som er eldre enn 21, sorter etter alder med høyeste først:

```sql
SELECT s.navn, m.nummer
FROM Student s, s.eier m
WHERE s.alder > 21
ORDER BY s.alder DESC
```

Legg merke til *s.eier* i FROM. Dette er en vanlig konstruksjon i OQL, men forekommer ikke i SQL. Man vil også finne en del andre avvik i syntaksen.

## Referanser