Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenmodell (https://www.delphipraxis.net/146826-datenmodell.html)

Cogito 27. Jan 2010 13:59

Datenbank: MS SQL Server • Version: 2008 • Zugriff über: Native SQL

Datenmodell
 
Hallo zusammen,

ich bin leider nicht so erfahren im Aufbau einer Datenbank (Normalisierung usw...), deshalb schildere ich einfach mal kurz das Problem, für das ich ein DB-Modell bräuchte.
In meiner Anwendung sollen Datenbankverbindungen gespeichert werden, auf denen basierend dann später Modelle entworfen werden können (welche Modelle spielt in diesem Zusammenhang keine Rolle). Eine DB-Verbindung ist gekennzeichnet durch z.B. Datenbankname, Provider, Server, Username usw...
Beim Start der Anwendung müssen sich Benutzer anmelden, deshalb habe ich auch eine Benutzertabelle (UserID, Loginname, Fullname usw....). Jeder Benutzer soll beliebig viele DB-Verbindungen anlegen können. So weit so gut. Nun soll es aber auch Verbindungs-Gruppen geben, die es jedem Benutzer, der für diese Gruppe eingetragen ist, ermöglichen soll, auf die in dieser Gruppe definierten Verbindungen zugreifen zu können. Andere Verbindungen in Gruppen, für die er nicht eingetragen ist, darf er natürlich nicht sehen. Nun suche ich ein passendes DB-Modell um diese Anforderungen abzudecken, um relativ einfach mittels SQL später zu jedem User alle Verbindungen, auch die in den Gruppen definierten, für die er eingetragen ist, auflistet.
Kann hier einer helfen?

Jens Hartmann 27. Jan 2010 14:04

Re: Datenmodell
 
Hallo,

ich weiß nicht ob ich damit richtig liege, aber ich könnte mir vorstellen das Du das mit Firebird und Views realisieren kannst.

Gruß Jens

Cogito 27. Jan 2010 14:08

Re: Datenmodell
 
Zitat:

Zitat von Jens Hartmann
Hallo,

ich weiß nicht ob ich damit richtig liege, aber ich könnte mir vorstellen das Du das mit Firebird und Views realisieren kannst.

Gruß Jens

Hallo Jens,

das kann ich denke ich mit jedem relationalen DB-System lösen, die Frage war, wie sieht das Datenbankmodell für das geschilderte Szenario aus?

Blup 28. Jan 2010 07:15

Re: Datenmodell
 
Vieleicht so:
Code:
T_CustomGruppen
ID

T_Benutzer
ID    PK FK->T_CustomGruppen
{...}

T_Gruppen
ID    PK FK->T_CustomGruppen
{...}

T_Verbindungen
ID    PK FK->T_CustomGruppen
NR    PK
{...}

T_GruppenMitglieder
ID_Gruppe  PK FK->T_Gruppen
ID_Benutzer PK FK->T_Benutzer

Cogito 28. Jan 2010 08:37

Re: Datenmodell
 
Zitat:

Zitat von Blup
Vieleicht so:
Code:
T_CustomGruppen
ID

T_Benutzer
ID    PK FK->T_CustomGruppen
{...}

T_Gruppen
ID    PK FK->T_CustomGruppen
{...}

T_Verbindungen
ID    PK FK->T_CustomGruppen
NR    PK
{...}

T_GruppenMitglieder
ID_Gruppe  PK FK->T_Gruppen
ID_Benutzer PK FK->T_Benutzer

Aha, interessant!
In der Tabelle CustomGruppen würden also quasi die Informationen der Benutzer, Gruppen und Verbindungen zusammenlaufen, sowie in GruppenMitglieder die Benutzer und Gruppenzugehörigkeit ersichtlich?
Welcher Art sollten denn die Verbindungen sein (Referenzintegrität, 1:n )?

sniper_w 28. Jan 2010 09:07

Re: Datenmodell
 
Jede Gruppe kann n mitglieder enthalten und jeder Mitglied kann zu m Gruppen zugeordnet sein ? Dann eher n:m

Cogito 28. Jan 2010 10:10

Re: Datenmodell
 
Zitat:

Zitat von sniper_w
Jede Gruppe kann n mitglieder enthalten und jeder Mitglied kann zu m Gruppen zugeordnet sein ? Dann eher n:m

Bitte etwas ausführlicher und präziser. Welche Gruppen meinst du jetzt...
Könnte man das Modell von Blup mal als kleines ER Modell (gerne in Access mit dem Modelldesigner erstellt und als bild speichern) posten, damit man die Zusammenhänge, Relationen und Abhängigkeiten erkennen kann?

sniper_w 28. Jan 2010 15:57

Re: Datenmodell
 
Zitat:

Zitat von Cogito
Nun soll es aber auch Verbindungs-Gruppen geben, die es jedem Benutzer, der für diese Gruppe eingetragen ist, ermöglichen soll, auf die in dieser Gruppe definierten Verbindungen zugreifen zu können.


Cogito 29. Jan 2010 09:18

Re: Datenmodell
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das jetzt mal als Relationen abgebildet. Wäre das ok so oder stimmen irgendwelche Relationen nicht?

Blup 29. Jan 2010 13:17

Re: Datenmodell
 
Liste der Anhänge anzeigen (Anzahl: 1)
ConnectionGroupsMembers:
Die OID ist zumindest für die Datenbank überflüssig.
Die Kompination aus ID_Groups und ID_Users ist eineutig und könnte der Primärschlüssel sein.
Die Tabelle enthält nur Relationen zwischen zwei Identitäten und es gibt keine abhängigen Tabellen.

ConnectionGroups
Von den Spalten OID und ConnectionGroupsID ist eine überflüssig.
Ein Objekt sollte nur eine ID haben und dafür reicht ein Feld OID.
Die Beziehungen zu den Tabellen ConnectionGroupsMembers und CustomConnectionGroups sollten über dieses eine Feld laufen.

Users
Hier gilt das selbe wie für ConnectionGroups.

CustomConnectionGroups
Menge(CustomConnectionGroups) = Menge(Users) + Menge(ConnectionGroups)
Die Beziehung zwischen CustomConnectionGroups und ConnectionGroups ist zwar 1:N, aber N kann nur 0 oder 1 sein.
Für jeden Eintrag in ConnectionGroups gibt es genau einen Eintrag in CustomConnectionGroups (eindeutig), aber nicht für jeden Eintrag CustomConnectionGroups gibt es auch einen Eintrag in ConnectionGroups (nicht eineindeutig).
Das gilt ebenso für die Beziehung CustomConnectionGroups zu Users.

Cogito 29. Jan 2010 14:25

Re: Datenmodell
 
Zitat:

Zitat von Blup
ConnectionGroupsMembers:
Die OID ist zumindest für die Datenbank überflüssig.
Die Kompination aus ID_Groups und ID_Users ist eineutig und könnte der Primärschlüssel sein.
Die Tabelle enthält nur Relationen zwischen zwei Identitäten und es gibt keine abhängigen Tabellen.

ConnectionGroups
Von den Spalten OID und ConnectionGroupsID ist eine überflüssig.
Ein Objekt sollte nur eine ID haben und dafür reicht ein Feld OID.
Die Beziehungen zu den Tabellen ConnectionGroupsMembers und CustomConnectionGroups sollten über dieses eine Feld laufen.

Users
Hier gilt das selbe wie für ConnectionGroups.

CustomConnectionGroups
Menge(CustomConnectionGroups) = Menge(Users) + Menge(ConnectionGroups)
Die Beziehung zwischen CustomConnectionGroups und ConnectionGroups ist zwar 1:N, aber N kann nur 0 oder 1 sein.
Für jeden Eintrag in ConnectionGroups gibt es genau einen Eintrag in CustomConnectionGroups (eindeutig), aber nicht für jeden Eintrag CustomConnectionGroups gibt es auch einen Eintrag in ConnectionGroups (nicht eineindeutig).
Das gilt ebenso für die Beziehung CustomConnectionGroups zu Users.

Vielen Dank, das sieht schon gut aus!
Darf ich nochmal resümieren, wie ich das bisher verstanden habe (als nicht DB erfahren):

- Benutzer werden beim neuanlegen in die Tabelle T_Benutzer eingetragen
- Gruppen werden in T_Gruppen angelegt
- Wird ein Benutzer einer Gruppe hinzugefügt wird die ID des Benutzers und die ID der Gruppe in die Tabelle T_Gruppenmitglieder eingefügt

Der Rest, muss ich gestehen, ist mir noch nicht ganz klar.
Könntest Du mir hier noch bitte erklären, was hier bei den einzelnen Vorgängen zu tun ist, analog zu den drei Schritten oben? Also z.B. was beim Anlegen einer Verbindung zu tun ist.. usw...

Blup 29. Jan 2010 15:57

Re: Datenmodell
 
Zitat:

Zitat von Cogito
- Benutzer werden beim neuanlegen in die Tabelle T_BENUTZER eingetragen

Der Benutzer ist im Prinzip eine Rolle von CustomGruppe.
Seine OID stammt aus der Identität in der Tabelle T_CUSTOMGRUPPEN.
(Man könnte das auch als Klasse und abgeleitete Klasse verstehen.)

Deshalb wird zuerst eine neue OID erzeugt und in CUSTOMGRUPPEN eingetragen.
Jetzt kann der Benutzer mit der selben OID in T_BENUTZER eingetragen werden.
Mit BeforeInsert-Trigger lässt sich das automatieren.

Zitat:

Zitat von Cogito
- Gruppen werden in T_Gruppen angelegt

Hier gilt gleiches wie für Benutzer.

Zitat:

Zitat von Cogito
- Wird ein Benutzer einer Gruppe hinzugefügt wird die ID des Benutzers und die ID der Gruppe in die Tabelle T_Gruppenmitglieder eingefügt

Logisch.

Zitat:

Zitat von Cogito
Also z.B. was beim Anlegen einer Verbindung zu tun ist.. usw...

Sowohl Benutzer als auch Gruppe sind Rollen der CustomGruppe.
Beide besitzen eine OID die aber aus ihrer eigentlichen Identät T_CUSTOMGRUPPEN stammt.
Es genügt also die OID (des Benutzers oder einer Gruppe) zu nehmen, als weiteres Kriterium für die Eindeutigkeit (1:N) z.b. eine fortlaufende Nummer und mit den weiteren Daten in T_VERBINDUNGEN einzutragen.
(Die Basisklasse CustomGruppe hat eine Liste von Verbindungen, sowohl Benutzer als auch Gruppen erben diese.)

Die Verbindung ist übrigens keine eigene Identität, sie kann nur existieren wenn auch eine entsprechende CustomGruppe existiert.

Cogito 30. Jan 2010 11:11

Re: Datenmodell
 
OK, verstanden. Vielen Dank für die ausführliche Erklärung!
Und wie frage ich z.B. nun ab, in welcher oder welchen Gruppen ein Benutzer ist?

Blup 1. Feb 2010 08:16

Re: Datenmodell
 
Zitat:

Zitat von Cogito
Und wie frage ich z.B. nun ab, in welcher oder welchen Gruppen ein Benutzer ist?

z.B. so:
SQL-Code:
select id_gruppe
from  T_GruppenMitglieder
where id_benutzer = :id_benutzer
oder falls alle Daten der Gruppe(n) gebraucht werden:
SQL-Code:
select   b.*
from     T_GruppenMitglieder a
left join T_Gruppen          b on b.id = a.id_gruppe
where    a.id_benutzer = :id_benutzer
Wobei Parameter wie hier ":id_benutzer" je nach Datenbank/Komponenten eventuell anders notiert werden.

Cogito 1. Feb 2010 14:13

Re: Datenmodell
 
Danke schön für die Antworten!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz