Zum Inhalt springen

Odoo-Datenbanken vs. Mandanten: Technische und organisatorische Unterschiede

15. August 2026 durch
Odoo-Datenbanken vs. Mandanten: Technische und organisatorische Unterschiede
Dietmar Hamm

In Odoo werden die Begriffe Datenbank und Mandant oft verwechselt, obwohl sie fundamentale Unterschiede aufweisen. Eine Datenbank ist eine eigenständige PostgreSQL-Instanz mit völlig getrennten Benutzern, Modulen und Konfigurationen, während ein Mandant ein organisatorisches Konzept innerhalb derselben Datenbank darstellt. Das Verständnis dieser Unterscheidung ist für die korrekte Architektur und Datenverwaltung in Odoo-Systemen entscheidend.

Ich habe im Quellcode nachgeschaut, um Ihnen den Unterschied fundiert zu erklären – "Datenbank" und "Mandant" (Company) sind zwei völlig unterschiedliche, hierarchisch verschachtelte Konzepte in Odoo.

1. Odoo-Datenbank (technische Ebene, PostgreSQL)

Eine Odoo-Datenbank ist eine eigenständige PostgreSQL-Datenbank mit einem eigenen kompletten Datenmodell: eigene Benutzer, eigene Sequenzen, eigene Module/Installationen, eigene ir.config_parameter, eigene Sessions. Zwei Datenbanken sind vollständig getrennt – es gibt keine gemeinsamen Daten, keine gemeinsame Anmeldung, keine gemeinsame Sequenznummer. Man wechselt zwischen Datenbanken über die Datenbank-Auswahl beim Login (URL /web/database/selector) bzw. serverseitig über den dbfilter.

  • odoo_18/odoo/http.py:334-348db_list(force=False, host=None) – ermittelt die Liste aller auf dem Server tatsächlich existierenden PostgreSQL-Datenbanken via odoo.service.db.list_dbs(force) und filtert sie anschließend über db_filter().
  • odoo_18/odoo/http.py:351-380db_filter(dbs, host=None) – wendet die Server-Konfiguration config['dbfilter'] (Regex mit Platzhaltern %h/%d für Host/Domain) an, um zu bestimmen, welche Datenbank(en) für eine eingehende Anfrage überhaupt sichtbar/erreichbar sind. Das ist der technische Mechanismus, mit dem mehrere komplett unabhängige Odoo-Datenbanken auf demselben Server voneinander isoliert bzw. je nach Domain zugeordnet werden.

Zwei Datenbanken bedeuten also: zwei getrennte Installationen, zwei getrennte Login-Systeme, zwei getrennte Datensätze – man kann sie nicht in einer Ansicht kombinieren, nicht per internem Odoo-Report übergreifend auswerten, und Updates/Backups laufen pro Datenbank separat.

2. Mandant / Company (res.company, logische Ebene innerhalb EINER Datenbank)

Ein Mandant ist ein Datensatz vom Typ res.company innerhalb derselben Datenbank. Odoo unterstützt "Multi-Company" nativ: mehrere Firmen teilen sich dieselbe Datenbank, denselben Benutzerpool, dieselben Menüs/Module – aber Daten werden über ein company_id-Feld pro Datensatz sauber getrennt bzw. können firmenübergreifend konsolidiert werden.

  • odoo_18/odoo/addons/base/models/res_company.py:17-22class Company(models.Model) mit _name = "res.company" – das zentrale Modell für Mandanten. Interessant: parent_id/child_ids erlauben hierarchische Firmenstrukturen (Mutter-/Tochtergesellschaften) innerhalb derselben DB.
  • odoo_18/odoo/addons/base/models/res_company.py:24-25Company.copy(self, default=None) – wirft absichtlich einen UserError, da das Duplizieren eines Mandanten nicht erlaubt ist; neue Firmen müssen bewusst neu angelegt werden.
  • odoo_18/odoo/addons/base/models/res_users.py:401-404company_id (Standard-Mandant des Benutzers) und company_ids (Many2many, alle Mandanten, auf die der Benutzer Zugriff hat) – zeigt, dass ein einzelner Benutzer in derselben Datenbank mehreren Mandanten zugeordnet sein und zwischen ihnen wechseln kann (der bekannte Firmen-Umschalter oben rechts im Backend).
  • odoo_18/odoo/addons/base/models/res_users.py:589-597_check_company() – ein @api.constrains, das sicherstellt, dass der aktive Standard-company_id eines Users immer auch Teil seiner erlaubten company_ids ist. Das ist die Integritätsregel, die Multi-Company-Zuordnungen konsistent hält.
  • Der Kontext-Schlüssel allowed_company_ids taucht in sehr vielen Modulen auf (z. B. odoo_18/addons/stock/models/product.py:554, odoo_18/addons/hr/models/res_users.py:85, odoo_18/addons/web/controllers/json.py:236) – er steuert, welche Mandanten in der aktuellen Session/Sitzung des Benutzers gerade "aktiv geschaltet" sind, und wird von vielen domain-Definitionen genutzt, um Datensätze auf die erlaubten Firmen einzuschränken.

Zusammengefasst

Zwei Datenbanken Zwei Mandanten (Companies)
Ebene Infrastruktur/PostgreSQL Logisches Odoo-Modell (res.company)
Trennung Vollständig, komplett isoliert Nur über company_id-Feld auf Datensätzen
Benutzer Getrennte User-Tabellen, getrennter Login Ein User kann mehreren Companies zugeordnet sein (company_ids)
Wechsel Neuer Login/URL nötig, gesteuert über dbfilter Firmen-Umschalter im Backend, allowed_company_ids im Kontext
Konsolidierung/Reporting über mehrere Einheiten Nicht nativ möglich (getrennte DBs) Nativ möglich (z. B. Konsolidierungs-Reports über mehrere Companies)
Wartung/Updates Pro Datenbank separat Gemeinsam für alle Mandanten in der DB

Kurz gesagt: Eine Datenbank ist der "Container" (Server-Instanz mit allen Daten), ein Mandant ist eine "Firma innerhalb dieses Containers". Odoo empfiehlt in der Regel Multi-Company (mehrere Mandanten in einer DB) gegenüber mehreren separaten Datenbanken, wann immer Benutzer, Kontakte oder Produkte gemeinsam genutzt werden sollen – separate Datenbanken lohnen sich eher, wenn völlig unabhängige, isolierte Installationen benötigt werden (z. B. unterschiedliche Kunden, unterschiedliche Odoo-Versionen, keinerlei Datenaustausch gewünscht).

📎 Quellreferenzen


Oddy
Oddy
Odoo-Expertin bei Detalex GmbH
Oddy ausprobieren

Oddy ist ein Produkt der Detalex GmbH. Wir unterstützen unsere Kunden mit Custom-Entwicklung, Beratung und Hosting für Odoo.

Termin vereinbaren

Keine Neuigkeiten verpassen

Erhalte neue Blog-Beiträge direkt in dein Postfach. Kein Spam, jederzeit abbestellbar.

Danke! Du bist jetzt angemeldet.

Keine Neuigkeiten verpassen

Erhalte neue Blog-Beiträge direkt in dein Postfach. Kein Spam, jederzeit abbestellbar.

Danke! Du bist jetzt angemeldet.