Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Mandantenfähiges Datenbankdesign

437 views
Skip to first unread message

Mirandus

unread,
Aug 15, 2009, 4:23:10 AM8/15/09
to
Hallo!

Zustand:
KundeA und KundeB arbeiten auf zwei verschiedenen Datenbanken. Die
Datenbanken sind vom Aufbau her identisch. Jeder Kunde hat eine
Tabelle "mitarbeiter".

Problem:
Ich möchte nun erreichen, dass KundeA Mitarbeiter für KundeB in seiner
Datenbank "freischalten" kann, sodass KundeB die Mitarbeiter von
KundeA bei sich im System einplanen kann.
So soll ein Abfrage "Select * FROM mitarbeiterB" die Mitarbeiter von
KundeB und die freigeschaltet Mitarbeiter von KundeA zurückgeben.

Frage:
Kann man diese Problem in MySQL datenbanktechnisch lösen? Ich möchte
ungern eine clientseitige Logik implementieren. Views über UNION sind
dabei keine Lösung, da diese nicht "updateable" sind.

Ich bin auch für generelle Anregungen zur Lösung dieses Problems
dankbar (z.B andere Datenbank)!

Gruß

Mirandus

Bernd Hohmann

unread,
Aug 15, 2009, 4:58:27 AM8/15/09
to
Mirandus schrieb:

> Ich bin auch für generelle Anregungen zur Lösung dieses Problems
> dankbar (z.B andere Datenbank)!

Mehrmandantenfähigkeit kann man entweder über getrennte Datenbanken oder
über ein Mandantenpräfix im Primary-Key erreichen.

Getrennte Datenbanken nimmt man dann, wenn mandantenübergreifende
Operationen eher selten sind (siehe
http://dev.mysql.com/doc/refman/5.1/en/use.html)

Den Mandanten mit in den PK aufzunehmen nimmt man dann, wenn sowas
häufiger vorkommt (hier kann man den Mandanten besser parametrisieren,
was zb. wichtig für PreparedStatements ist).

Wenn der Client-Code aber nicht für diese Mandantenübergreifenden
Operationen ausgelegt ist, hast Du bei einer nachträglichen Änderung
etwas schlechte Karten - da wirst Du früher oder später am Client
nachpflegen müssen.

Bernd

--
Visit http://www.nixwill.de and http://www.spammichvoll.de
jean....@nixwill.de & bernado....@spammichvoll.de

Mirandus

unread,
Aug 16, 2009, 3:04:39 AM8/16/09
to
On 15 Aug., 10:58, Bernd Hohmann <bernd.hohmann.

20090...@freihaendler.com> wrote:
> Mirandus schrieb:
>
> > Ich bin auch für generelle Anregungen zur Lösung dieses Problems
> > dankbar (z.B andere Datenbank)!
>
> Mehrmandantenfähigkeit kann man entweder über getrennte Datenbanken oder
> über ein Mandantenpräfix im Primary-Key erreichen.
>
> Getrennte Datenbanken nimmt man dann, wenn mandantenübergreifende
> Operationen eher selten sind (siehehttp://dev.mysql.com/doc/refman/5.1/en/use.html)

>
> Den Mandanten mit in den PK aufzunehmen nimmt man dann, wenn sowas
> häufiger vorkommt (hier kann man den Mandanten besser parametrisieren,
> was zb. wichtig für PreparedStatements ist).
>
> Wenn der Client-Code aber nicht für diese Mandantenübergreifenden
> Operationen ausgelegt ist, hast Du bei einer nachträglichen Änderung
> etwas schlechte Karten - da wirst Du früher oder später am Client
> nachpflegen müssen.
>
> Bernd
>
> --
> Visithttp://www.nixwill.deandhttp://www.spammichvoll.de
> jean.oli...@nixwill.de & bernado.bernha...@spammichvoll.de

Hallo Bernd!

Danke für deine Hilfe!

> Wenn der Client-Code aber nicht für diese Mandantenübergreifenden
> Operationen ausgelegt ist, hast Du bei einer nachträglichen Änderung
> etwas schlechte Karten - da wirst Du früher oder später am Client
> nachpflegen müssen.

Das ist zwar nicht das, was ich hören wollte, aber ich hab es mir
schon fast gedacht ;-)

Wenn ich dich richtig verstanden habe, nutzt man eine Datenbank bei
häufig vorkommenden Mandanenoperationen, getrennte Datenbanke, wenn
diese Operationen eher sporadisch sind.

Bei einer Datenbank: Wie sieht es hier mir den Backups aus? Dann kann
man nur das gesamte System (von allen Kunden) sichern und
wiederherstellen, oder?

Danke und Gruß

Jörg

Bernd Hohmann

unread,
Aug 16, 2009, 5:26:15 AM8/16/09
to
Mirandus schrieb:

> Wenn ich dich richtig verstanden habe, nutzt man eine Datenbank bei
> häufig vorkommenden Mandanenoperationen, getrennte Datenbanke, wenn
> diese Operationen eher sporadisch sind.

Ja. Getrennte Datenbanken sind der Normalfall, Mischformen (wo zb. die
Datenbanken "A_MANDANT B_MANDANT..." heissen und in der Datenbank
"A_MANDANT" noch Mandantenübergreifende Tabellen mit "A..Z" im Primary
Key liegen sind aber häufiger als man denkt (zumindest hier).

> Bei einer Datenbank: Wie sieht es hier mir den Backups aus? Dann kann
> man nur das gesamte System (von allen Kunden) sichern und
> wiederherstellen, oder?

Im Prinzip ja. Aber normalerweise sperrt man die Applikation eh
irgendwann Nachts, zieht seine automatischen Wartungen durch und macht
am Ende ein Vollbackup. Danach kann man dann nochmal diese "alles in
einem Tabellen" Mandantenweise exportieren.

Mirandus

unread,
Aug 16, 2009, 1:27:21 PM8/16/09
to
Hallo Bernd!

> Ja. Getrennte Datenbanken sind der Normalfall, Mischformen (wo zb. die
> Datenbanken "A_MANDANT B_MANDANT..." heissen und in der Datenbank
> "A_MANDANT" noch Mandantenübergreifende Tabellen mit "A..Z" im Primary
> Key liegen sind aber häufiger als man denkt (zumindest hier).

Könntest du das vielleicht genauer erklären? Wie sollte z.B der
Primary Key konkret aussehen?

Danke und Gruß

Jörg

Bernd Hohmann

unread,
Aug 16, 2009, 1:45:46 PM8/16/09
to
Mirandus schrieb:

> Könntest du das vielleicht genauer erklären? Wie sollte z.B der
> Primary Key konkret aussehen?

Naja - klassische Warenwirtschaft sieht so aus (pseudosql)

TABLE ARTIKEL
NUMMER AS STRING * 8 PRIMARY_KEY
HERSTELLER AS STRING * 6 PRIMARY_KEY
BEZEICHNUNG_1 AS STRING * 40
BEZEICHNUNG_2 AS STRING * 40
...

hast Du dann halt sowas:

TABLE ARTIKEL
MANDANT AS STRING * 1 PRIMARY_KEY
NUMMER AS STRING * 8 PRIMARY_KEY
HERSTELLER AS STRING * 6 PRIMARY_KEY
BEZEICHNUNG_1 AS STRING * 40
BEZEICHNUNG_2 AS STRING * 40
...

SELECT * FROM ARTIKEL WHERE MANDANT="A" AND NUMMER="4711" AND
HERSTELLER="0000815"

Diese Variante mit dem Mandanten im Primary-Key kann ich aber wirklich
nur dann anraten, wenn es ein ganz restriktives Querymanagement von
Seiten der DBAs oder einer Abteilung gibt, welche die Datenbankabfragen
in SQL giesst und zb. als Java-Objekte zurückliefert - für "mal eben in
PHP was machen" ist das einfach zu oversized und ich kenn auch kaum ein
Querytool, was diese Mandantenfähigkeit von Hause aus mitliefert (da
wird immer über separate Datenbanken geschafft).

Dominik Echterbruch

unread,
Aug 17, 2009, 5:40:27 AM8/17/09
to
Mirandus wrote:
^^^^^^^^
Realname w�re nett. Danke.

> Bei einer Datenbank: Wie sieht es hier mir den Backups aus? Dann kann
> man nur das gesamte System (von allen Kunden) sichern und
> wiederherstellen, oder?

mysqldump bietet die M�glichkeit, beim Dumpen einzelner Tabellen ein
WHERE-Statement mit anzugeben. Damit kannst du �bergreifende Tabellen
nach Mandanten getrennt sichern.

Siehe auch:
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_where

Gr��e,
Dominik
--
Wo k�men wir hin, wenn alle sagten, wo k�men wir hin, und niemand
ginge, um einmal zu schauen, wohin man k�me, wenn man ginge.
Autor: Kurt Marti (http://de.wikiquote.org/wiki/Kurt_Marti)

0 new messages