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-348 →
db_list(force=False, host=None)– ermittelt die Liste aller auf dem Server tatsächlich existierenden PostgreSQL-Datenbanken viaodoo.service.db.list_dbs(force)und filtert sie anschließend überdb_filter(). - odoo_18/odoo/http.py:351-380 →
db_filter(dbs, host=None)– wendet die Server-Konfigurationconfig['dbfilter'](Regex mit Platzhaltern%h/%dfü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-22 →
class Company(models.Model)mit_name = "res.company"– das zentrale Modell für Mandanten. Interessant:parent_id/child_idserlauben hierarchische Firmenstrukturen (Mutter-/Tochtergesellschaften) innerhalb derselben DB. - odoo_18/odoo/addons/base/models/res_company.py:24-25 →
Company.copy(self, default=None)– wirft absichtlich einenUserError, 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-404 →
company_id(Standard-Mandant des Benutzers) undcompany_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_ideines Users immer auch Teil seiner erlaubtencompany_idsist. Das ist die Integritätsregel, die Multi-Company-Zuordnungen konsistent hält. - Der Kontext-Schlüssel
allowed_company_idstaucht 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 vielendomain-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
- odoo_18/odoo/http.py →
db_list(),db_filter()(Odoo 18 Community) - odoo_18/odoo/addons/base/models/res_company.py →
class Company(Odoo 18 Community) - odoo_18/odoo/addons/base/models/res_users.py →
company_id,company_ids,_check_company()(Odoo 18 Community)
Oddy ist ein Produkt der Detalex GmbH. Wir unterstützen unsere Kunden mit Custom-Entwicklung, Beratung und Hosting für Odoo.
Termin vereinbaren