Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankstruktur bzw. -einteilung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankstruktur bzw. -einteilung

    Hallo zusammen,

    ich brauche bitte wieder ein paar kleine Denkanstöße von euch...
    Folgende Problemstellung:

    Ich möchte eine zentrale Tabelle, um in diese alle User einer Seite mit deren ID, das zugehörige Passwort und den jeweiligen Rechten des Users speichern. Schwer wird es für mich aktuell, da die IDs der User aus drei verschiedenen Tabellen stammen. Es gibt eine Tabelle Personal, eine Tabelle Betreiber und eine Tabelle Spieler.

    Der Ansatz für die Tabelle tblUsers wird ja so nicht funktionieren:
    user_ID | ID (aus den drei Tabellen) | Passwort | Rechte

    Aktuell sieht meine Lösung so aus (bin damit aber nicht happy)

    Tabelle tblPersonal:
    persoID | user_ID (aus der Tabelle tblUsers) | Vorname | Nachname | ...

    Tabelle tblBetreiber:
    btreiID | user_ID (aus der Tabelle tblUsers) | Vorname | Nachname | ...

    Tabelle tblSpieler:
    spielID | user_ID (aus der Tabelle tblUsers) | Vorname | Nachname | ...

    Tabelle tblUsers:
    user_ID | Benutzername | Passwort | Rechte

    Irgendwie kommt mir diese Art der Relation "rückwärts" vor. Ich hoffe, es ist soweit klar, was ich damit sagen will.

    Habt ihr dafür einen besseren Ansatz? Die Punkte am Ende der jeweiligen Tabelle sollen zeigen, dass es dann für jeden Tabellentyp auch noch spezifische Einträge gibt.

    Vielen Dank für euer Feedback!

  • #2
    Zitat von michiman Beitrag anzeigen

    Ich möchte eine zentrale Tabelle, um in diese alle User einer Seite mit deren ID, das zugehörige Passwort und den jeweiligen Rechten des Users speichern. Schwer wird es für mich aktuell, da die IDs der User aus drei verschiedenen Tabellen stammen. Es gibt eine Tabelle Personal, eine Tabelle Betreiber und eine Tabelle Spieler.

    Der Ansatz für die Tabelle tblUsers wird ja so nicht funktionieren:
    user_ID | ID (aus den drei Tabellen) | Passwort | Rechte

    Aktuell sieht meine Lösung so aus (bin damit aber nicht happy)

    Tabelle tblPersonal:
    persoID | user_ID (aus der Tabelle tblUsers) | Vorname | Nachname | ...

    Tabelle tblBetreiber:
    btreiID | user_ID (aus der Tabelle tblUsers) | Vorname | Nachname | ...

    Tabelle tblSpieler:
    spielID | user_ID (aus der Tabelle tblUsers) | Vorname | Nachname | ...

    Tabelle tblUsers:
    user_ID | Benutzername | Passwort | Rechte

    Irgendwie kommt mir diese Art der Relation "rückwärts" vor. Ich hoffe, es ist soweit klar, was ich damit sagen will.

    Habt ihr dafür einen besseren Ansatz?
    Na klar.

    Code:
    test=# create table users(id serial primary key, vorname text, nachname text);
    CREATE TABLE
    Time: 24,253 ms
    test=*# create table personal (personal_kram text) inherits (users);
    CREATE TABLE
    Time: 2,682 ms
    test=*# create table betreiber (betreiber_kram text) inherits (users);
    CREATE TABLE
    Time: 5,112 ms
    test=*# create table spieler (spieler_kram text) inherits (users);
    CREATE TABLE
    Time: 2,914 ms
    test=*# \d users;
                              Table "public.users"
      Column  |  Type   |                     Modifiers
    ----------+---------+----------------------------------------------------
     id       | integer | not null default nextval('users_id_seq'::regclass)
     vorname  | text    |
     nachname | text    |
    Indexes:
        "users_pkey" PRIMARY KEY, btree (id)
    Number of child tables: 3 (Use \d+ to list them.)
    
    test=*# \d spieler 
                               Table "public.spieler"
        Column    |  Type   |                     Modifiers
    --------------+---------+----------------------------------------------------
     id           | integer | not null default nextval('users_id_seq'::regclass)
     vorname      | text    |
     nachname     | text    |
     spieler_kram | text    |
    Inherits: users
    
    test=*# insert into spieler values (default, 'spieler1_vorname', 'spieler1_nachname','spielerkram1');
    INSERT 0 1
    Time: 0,369 ms
    test=*# select * from users;
     id |     vorname      |     nachname
    ----+------------------+-------------------
      1 | spieler1_vorname | spieler1_nachname
    (1 row)
    
    test=*# insert into betreiber values (default, 'betreiber1_vorname', 'betreiber_nachname','betreiberkram1');
    INSERT 0 1
    Time: 0,392 ms
    test=*# select * from users;
     id |      vorname       |      nachname
    ----+--------------------+--------------------
      2 | betreiber1_vorname | betreiber_nachname
      1 | spieler1_vorname   | spieler1_nachname
    (2 rows)
    
    test=*# select * from betreiber ;
     id |      vorname       |      nachname      | betreiber_kram
    ----+--------------------+--------------------+----------------
      2 | betreiber1_vorname | betreiber_nachname | betreiberkram1
    (1 row)

    Ist doch das, was Du suchst, oder?
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Danke für Deine Antwort. Ich kann nicht sicher sagen, ob es das ist, was ich suche, weil ich es nicht 100% verstehe. Hab nur mal schnell nach "inherits" gegoogelt, da das etwas ist, was ich noch nicht kenne, aber google ist dahingehend eher sparsam, zumindest in deutsch

      Aber wenn ich das richtig verstehe, lege ich eine Tabelle User an, die sozusagen die Schnittmenge aller Tabellen als Inhalt hat und füge in den spezielleren Tabellen nur noch das ein, was z.B. zu Personal, Spieler, usw. gehört? Ist das richtig?

      Wird denn dann beim Erstellen eines neuen Eintrages in z.B. die Tabelle Spieler alle "Kerndaten" wie Vorname, Nachname, usw. in die Usertabelle geschrieben und die speziellen in dafür "zuständige" Tabelle?

      Der Grund, wieso ich alle an einer Stelle in einer Tabelle haben möchte, liegt darin, dass Benutzernamen unique sein sollen und zwar egal aus welcher der drei Gruppen er stammt.

      Ist das damit möglich? Und hast Du evtl. ein Stichwort nachdem ich suchen kann, damit ich mich auch dahingehend in die Thematik einlesen kann.

      Merci

      Kommentar


      • #4
        Zitat von michiman Beitrag anzeigen
        Aber wenn ich das richtig verstehe, lege ich eine Tabelle User an, die sozusagen die Schnittmenge aller Tabellen als Inhalt hat und füge in den spezielleren Tabellen nur noch das ein, was z.B. zu Personal, Spieler, usw. gehört? Ist das richtig?
        Exakt.

        Wird denn dann beim Erstellen eines neuen Eintrages in z.B. die Tabelle Spieler alle "Kerndaten" wie Vorname, Nachname, usw. in die Usertabelle geschrieben und die speziellen in dafür "zuständige" Tabelle?
        Ja.

        Der Grund, wieso ich alle an einer Stelle in einer Tabelle haben möchte, liegt darin, dass Benutzernamen unique sein sollen und zwar egal aus welcher der drei Gruppen er stammt.
        Ja, versteh.

        Ist das damit möglich?
        Ja.

        Und hast Du evtl. ein Stichwort nachdem ich suchen kann, damit ich mich auch dahingehend in die Thematik einlesen kann.

        Merci
        Hier die Doku dazu: http://www.postgresql.org/docs/9.3/s...heritance.html


        Andreas
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von michiman Beitrag anzeigen
          Der Grund, wieso ich alle an einer Stelle in einer Tabelle haben möchte, liegt darin, dass Benutzernamen unique sein sollen und zwar egal aus welcher der drei Gruppen er stammt.

          Ist das damit möglich?

          Sorry, das in dem Szenario nicht. Da müßte ich mal a bissl tiefer in der Trickkiste kramen...
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Aber wenn die "Kerntabelle" namens User eben neben dem Vorname, Nachnamen, bla bla bla, eben auch den Benutzernamen enthält und dieser auf unique gesetzt wird, müsste doch alles passen oder versteh ich da was falsch?

            Kommentar


            • #7
              Zitat von michiman Beitrag anzeigen
              Aber wenn die "Kerntabelle" namens User eben neben dem Vorname, Nachnamen, bla bla bla, eben auch den Benutzernamen enthält und dieser auf unique gesetzt wird, müsste doch alles passen oder versteh ich da was falsch?
              Ja. Verstehst Du. Falsch.

              Code:
              test=*# select * from users;
               id |      vorname       |      nachname
              ----+--------------------+--------------------
                2 | betreiber1_vorname | betreiber_nachname
                3 | spieler1_vorname   | betreiber_nachname
                4 | spieler1_vorname   | betreiber_nachname
                1 | spieler1_vorname   | spieler1_nachname
              (4 rows)
              
              Time: 0,246 ms
              test=*# select * from only users;
               id | vorname | nachname
              ----+---------+----------
              (0 rows)
              
              Time: 0,226 ms
              Das geht in Richtung Partitionierung und so. Die Master-Table bleibt leer, nur die abgeleiteten Tabellen enthalten Daten. Daher greifen Unique Constraints auf der Master-Tabelle nicht.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Die ganze Idee haut so auch nicht hin, da ich in MySQL unterwegs bin.

                Hast Du vielleicht noch eine andere Idee, wie ich einen Eintrag überprüfe, der in drei Tabellen unique sein soll?

                Danke

                Kommentar


                • #9
                  Zitat von michiman Beitrag anzeigen
                  Die ganze Idee haut so auch nicht hin, da ich in MySQL unterwegs bin.
                  Das kann man ändern, daher kein Mitleid.

                  Hast Du vielleicht noch eine andere Idee, wie ich einen Eintrag überprüfe, der in drei Tabellen unique sein soll?

                  Danke
                  Via TRIGGER, der die Einträge nochmals in eine extra Table einträgt, dort mit einem Unique Index? Naja, schön ist was anderes.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Zitat von akretschmer Beitrag anzeigen
                    Das kann man ändern, daher kein Mitleid.

                    Klar kann man, ich steh nur sehr weit unten auf der Wissens- und Lernleiter und muss ja irgendwo anfangen. Ich hab mich für MySQL entschieden und werde auch vorerst dabei bleiben, auch weil es für jemanden wie mich gar nicht abzusehen ist, worin genau die Vor- und Nachteile des jeweiligen Systems liegen.

                    Um nochmal auf mein eingangs geschildertes Problem zurück zu kommen...

                    Spricht aus eurer Sicht etwas gegen folgende DB-Struktur, z.B. in Hinblick auf die Normalisierung oder evtl. später eintretende, aber jetzt schon zu erkennende Performanceprobleme?

                    tblUser
                    user_ID (PK)| user_Benutzername | user_Passwort | user_Gruppe | user_Recht

                    tblPersonal
                    user_ID (PK + FK) | persoVorname | persoNachname | persoBlaBla

                    tblBetreiber
                    user_ID (PK + FK) | btreiVorname | btreiNachname | btreiStrasse | btreiPLZ | btreiTelefon | btreiBlaBla

                    tblSpieler
                    user_ID (PK + FK) | spielVorname | spielNachname | spielStrasse | spielPLZ | spielBlaBla

                    Kommentar


                    • #11
                      Zitat von michiman Beitrag anzeigen
                      Klar kann man, ich steh nur sehr weit unten auf der Wissens- und Lernleiter und muss ja irgendwo anfangen. Ich hab mich für MySQL entschieden und werde auch vorerst dabei bleiben, auch weil es für jemanden wie mich gar nicht abzusehen ist, worin genau die Vor- und Nachteile des jeweiligen Systems liegen.
                      Bleib dabei. Lernen durch Schmerzen kann auch effektiv sein.

                      Um nochmal auf mein eingangs geschildertes Problem zurück zu kommen...

                      Spricht aus eurer Sicht etwas gegen folgende DB-Struktur, z.B. in Hinblick auf die Normalisierung oder evtl. später eintretende, aber jetzt schon zu erkennende Performanceprobleme?

                      tblUser
                      user_ID | user_Benutzername | user_Passwort | user_Gruppe | user_Recht

                      tblPersonal
                      user_ID (FK) | persoVorname | persoNachname | persoBlaBla

                      tblBetreiber
                      user_ID (FK) | btreiVorname | btreiNachname | btreiStrasse | btreiPLZ | btreiTelefon | btreiBlaBla

                      tblSpieler
                      user_ID (FK) | spielVorname | spielNachname | spielStrasse | spielPLZ | spielBlaBla

                      Ich sehe keine primary Keys.
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        Zitat von akretschmer Beitrag anzeigen
                        Bleib dabei. Lernen durch Schmerzen kann auch effektiv sein.


                        Zitat von akretschmer Beitrag anzeigen
                        Ich sehe keine primary Keys.
                        alle ID-Felder, also in jeder Tabelle die erste Spalte (habs auch im Post oben nochmal nachgebessert)

                        Kommentar

                        Lädt...
                        X