Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Brauche Hilfe beim DB-Design

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von favorite, 12 Februar 2013.

  1. favorite

    favorite Benutzer

    Hallo Zusammen,

    Ich bin in Datenbanken etwas eingerostet oder sehe einfach den Wald lauter Bäume nicht mehr, weswegen ich euch um Rat bitte :)
    Ich muss eine Datenbank für eine Webpräsenz erstellen die wie folgt aussehen soll:

    -Besucher können sich mit E-Mail/Passwort registrieren
    -Ein Besucher kann Profile erstellen vom Typ A, B und C (Ein Nutzer muss kein Profil haben kann aber mehrere haben. Die Möglichkeit ist dem Nutzer überlassen)
    -Ein Profil kann in verschiedenen Städten agieren. Angenommen ein Nutzer hat ein Profil A und B dann kann Profil A z.B. nur für München und Köln gedacht sein und Profil B nur für z.B. Stuttgart.

    Man soll leicht abfragen können welche Profile ein Nutzer besitzt und in welchen Städten seine jeweiligen Profile agieren.

    Wenn ihr mir helfen könntet, dann würdet ihr mir weitere frustrierende Tage ersparen in denen ich nichts erreicht habe :/

    Vielen Dank im Vorraus,
    Gruß Robert
     
  2. akretschmer

    akretschmer Datenbank-Guru

    • Ist so ein Profil A für alle User gleich, oder hat User1 ein anderes A-Profil als User2?
    • gilt Profil A generell nur für München und Köln, oder gilt dies nur für Benutzer 27, bei Benutzer 36 gilt es aber für Dresden?
    • wenn Profil A für München gilt, darf dann Profil B auch für München gelten?
    • kann ein benutzer auch 2 oder mehr Profile vom Typ A haben?

    Und was hast Du bisher selber geschafft?

    Andreas
     
  3. favorite

    favorite Benutzer

    Es ist für alle gleich! Diese Profile sind gegeben und User die sich registriert haben können sich eins oder mehrere davon aussuchen. Aber wie gesagt sie müssen kein Profil besitzen.




    Genau. Wenn ein Nutzer Profile für München und Köln erstellt hat, dann sind die Profile auf der Website nur in München und Köln sichtbar. Aber ein Nutzer kann ein noch ein anderes Profil haben das z.B. nur für Nürnberg gilt. Die Städte sind nicht an den Benutzer sondern an die Profile gebunden.


    Ja darf es. Die Profile sind unabhängig voneinander.



    Nein, das darf er nicht.


    https://www.dropbox.com/s/s01k3n7llzr2uan/Aufzeichnen.JPG

    Profile A oder B entsprechen in diesem Vorschlag Models und Hostessen. Das ist jetzt nur auf diese beiden Profilarten beschränkt um es übersichtlich zu halten.



    lg
     
  4. akretschmer

    akretschmer Datenbank-Guru




    Ähm. So ganz versteh ich es nicht. Profile sind für alle gleich, es gibt 3, man sucht sie sich aus. Dann wieder erstellt der User welche. Die Städte sind an die Profile gebunden, es gibt aber nur 3 Profile und Profil A und B dürfen für dieselbe Stadt gelten.

    Im Bild, Deine erste Tabelle stadt, hat 4 Spalten für unterschiedliche Städte. Das allein sieht nach einer komplett vergeigten Idee aus.


    Andreas
     
  5. favorite

    favorite Benutzer

    Ja, Du hast es doch schon verstanden :) Mehr muss man auch nicht verstehen! Das die Idee im Vorschlag vergeigt ist, ist mir bewusst sonst würde ich nicht um Hilfe bitten :) Wenn Du es bisschen bildlicher haben willst: www.wuse.de

    Wie kann ich das denn lösen damit ich nicht für jede Stadt eine Spalte anlegen muss?...
    Und in diesem Vorschlag muss in der Tabelle 'Stadt' schon ein Datensatz existieren bevor ich überhaupt ein Profil anlegen kann. Das ist ja intuitiv gesehen schon falsch? Hab ich Recht?
    Robert
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Das ist das große Geheimniss des Datenbankdesigns, gut dokumentiert unter 'Normalisierung'.

    Nein.

    Code:
    test=# create table staedte (id int primary key, stadtname text);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "staedte_pkey" for table "staedte"
    CREATE TABLE
    test=*# create table profile (name char(1) primary key, profilinfo text, check (name in ('A','B','C')));
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "profile_pkey" for table "profile"
    CREATE TABLE
    test=*# create table profil_stadt(profil char(1) references profile, stadt int references staedte, primary key(profil,stadt));
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "profil_stadt_pkey" for table "profil_stadt"
    CREATE TABLE
    test=*#
    test=*#
    test=*#
    test=*# insert into staedte values (1,'Dresden');
    INSERT 0 1
    test=*# insert into staedte values (2,'Berlin');
    INSERT 0 1
    test=*# insert into profile values ('A','profil A');
    INSERT 0 1
    test=*# insert into profile values ('B','profil B');
    INSERT 0 1
    test=*# insert into profil_stadt values ('A',1);
    INSERT 0 1
    test=*# insert into profil_stadt values ('B',2);
    INSERT 0 1
    

    Mal so als Gedankengang ...


    Andreas
     
    Tommi gefällt das.
  7. favorite

    favorite Benutzer

    hab aber noch kleine Verständnisfragen:

    Verstößt es dann nicht gegen die erste Normalform wenn alle Städtenamen in einem Textfeld sind?

    Gruß Robert
     
  8. akretschmer

    akretschmer Datenbank-Guru

    In was willst Du einen Städtenamen denn sonst speichern? Als DATE, INT, BOOL?


    Andreas
     
  9. favorite

    favorite Benutzer

    Vielleicht hab ich mich falsch ausgedrückt. Ich müsste jetzt, wenn ich nach Profilen suche die in einer bestimmten Stadt arbeiten mit LIKE %% suchen. Das ist doch unpraktisch und würde Ja auch gegen die erste NF verstossen?!
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Wie kommst Du darauf?

    Andreas
     
  11. favorite

    favorite Benutzer

    Weil Dein Vorschlag keine andere Wahl bietet. Oder wie könnte ich sonst nach Städten suchen?
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from profile;
     name | profilinfo
    ------+------------
     A    | profil A
     B    | profil B
    (2 rows)
    
    Time: 0,186 ms
    test=*# select * from staedte ;
     id | stadtname
    ----+-----------
      1 | Dresden
      2 | Berlin
    (2 rows)
    
    Time: 0,180 ms
    test=*# select * from profil_stadt ;
     profil | stadt
    --------+-------
     A      |     1
     B      |     2
    (2 rows)
    
    Time: 0,191 ms
    test=*# select p.name from profil_stadt ps left join profile p on ps.profil=p.name left join staedte s on ps.stadt=s.id where s.stadtname = 'Dresden';
     name
    ------
     A
    (1 row)
    
    Andreas
     
  13. favorite

    favorite Benutzer

    Aber ein Profil kann doch mehrere Städte haben.
     
  14. akretschmer

    akretschmer Datenbank-Guru

    Ja, und?

    Code:
    test=*# insert into profil_stadt values ('B',1);
    INSERT 0 1
    test=*# select p.name, s.stadtname from profil_stadt ps left join profile p on ps.profil=p.name left join staedte s on ps.stadt=s.id where p.name = 'B';
     name | stadtname
    ------+-----------
     B    | Dresden
     B    | Berlin
    (2 rows)
    [/quote]
     
     
    Andreas
     
  15. ukulele

    ukulele Datenbank-Guru

    Es verstößt immer gegen die Normalform wenn mehrere Städtenamen in einem einzelnen Textfeld stehen. Das muss aber nicht zwingend schlecht sein.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden