Brauche Hilfe beim DB-Design

favorite

Benutzer
Beiträge
9
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
 
Werbung:
  • 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
 
  • Ist so ein Profil A für alle User gleich, oder hat User1 ein anderes A-Profil als User2?
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.


  • 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?Andreas


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.


  • wenn Profil A für München gilt, darf dann Profil B auch für München gelten?
Ja darf es. Die Profile sind unabhängig voneinander.



  • kann ein benutzer auch 2 oder mehr Profile vom Typ A haben?

Nein, das darf er nicht.


Und was hast Du bisher selber geschafft?

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
 
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




Ä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
 
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
 
Wie kann ich das denn lösen damit ich nicht für jede Stadt eine Spalte anlegen muss?...

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

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

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
 
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?!
 
Weil Dein Vorschlag keine andere Wahl bietet. Oder wie könnte ich sonst nach Städten suchen?

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
 
Aber ein Profil kann doch mehrere Städte haben.

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
 
Werbung:
Es verstößt immer gegen die Normalform wenn mehrere Städtenamen in einem einzelnen Textfeld stehen. Das muss aber nicht zwingend schlecht sein.
 
Zurück
Oben