Datenbankstruktur wie am besten


#1

Hallo,
wie würdet ihr folgende Datenbanktabellen anlegen:

Es gibt mehrer User, welcher mehrere Händler haben kann mit je unterschiedlichen Gewinnspannen berechnet zb:

User 1:
Großhandel 1
Einkaufspreis 1-100 EURO nimmt er Aufschlag von 50%
Einkaufspreis 100 - 1000 EURO nimmt er einen Aufschlag von 25%
Großhandel 2
das gleiche wie oben

User 2:
Großhandel 1
Einkaufspreis 1-800 EURO nimmt er Aufschlag von 36%
Einkaufspreis 800 - 1000 EURO nimmt er einen Aufschlag von 20%
Großhandel 2
das gleiche wie oben

User 3:
Großhandel 2
Einkaufspreis 1-500 EURO nimmt er Aufschlag von 10%
Einkaufspreis 500 - 1000 EURO nimmt er einen Aufschlag von 12%
Großhandel 2
das gleiche wie oben

Nun hab ich keine Ahnung, wie ich die Datenbank am besten aufbauen soll. Wenn ich es wie folgt mache sind die Daten redundant

Tabell “user”
userId <- primary key
name

Tabelle “gewinnspannenHandel1”
userId <-primary key + foreign key von user-tabelle?
spanne von
spanne bis
aufschlagInProzent

Tabelle “gewinnspannenHandel2”
userId <-primary key + foreign key von user-tabelle?
spanne von
spanne bis
aufschlagInProzent


#2

Die Lösung ist eine dritte Tabelle, die den Großhändler angibt. Die “Gewinnspannentabelle” referenziert dann sowohl Nutzer als auch Großhändler…


#3
Tabelle "Aufschläge" 
Id <- generierter Schlüssel
userID <- FK User
haendlerID <- FK Händler
spanne von
spanne bis
aufschlagInProzent

Vielleicht noch die Tabelle in Aufschläge benennen, einen Primary Key generieren lassen und keine zusammengesetzten PrimaryKeys verwenden. Andere Tabellen via FK referenzieren.


#4

Aber für die ehemaligen zusammengesetzten PrimaryKeys Unique Key Contraints anlegen…

bye
TT


#5

Oh wow danke euch!

also Unique sollte dann in der Spalte Aufschläge sein: userId, haenlderID. spanneVon, spanneBis

Denn jede Spanne soll pro Händler und User ja nur einmal möglich sein, nicht dass jemand 2 Spannen einträgt aus versehen

Welche muss ich dann als Unique deklarieren? Alle 4?


#6

Kommt alles darauf an.

Wenn es Dumm läuft und das tut es immer, dann hat man für einen Händler plötzlich
0 - 500 = 10% Aufschlag
250 - 1000 = 20% Aufschlag
und möchte nun den Aufschlag für 400 Berechnen.
Das lässt sich auch nur recht schwierig mit UNIQUE Constraints abbilden.

Idealerweise würde man “von Spanne” weglassen und nur “bis Spanne” in der DB eintragen
Also
bis 500 = 10%
bis 1000 = 20%

Das kann man leichter mit Unique Constraints abbilden.
Den Aufschlag bekommt man dann über eine entsprechende Abfrage raus.
Aufschlag für kleinsten bis Wert der größer als der gesuchte Wert ist.


#7

Oder umgekehrt, also nur “von Spanne” und “bis Spanne” weglassen, denn “von 0” zu vergessen ist schwer (und ließe sich sogar programmatisch verhindern). Irgend wann in der Zukunft nicht daran denken, dass es jetzt eine neue “bis Spanne” benötigt wird ist einfach…

bye
TT


#8

Das mit den Spannen weglassen verstehe ich nicht, derzeit prüfe ich:
(dummy)
Select aufschlag from händlerPreisberechnung1 where ekPreis >= spanneVon AND <= spanneBis

Wenn ich jetzt eine davon weglasse, wie soll ich dann an den richtigen Faktor kommen? Zumal ich JPA nutzen möchte (ORM Mapping) da muss ich das auch irgendwie abbilden können :confused:


#9

Abhängig von der Datenbank und ob diese Top unterstützt, ansonsten
http://wiki.byte-welt.net/wiki/Limit_(SQL)
für weitere Varianten

SELECT Top 1 aufschlagInProzent  --auf das erste Ergebnis reduzieren
FROM Aufschläge
WHERE ekPreis >= vonSpanne       --alle gültigen Preisspannen heraussuchen, wenn von das untere Limit angibt
AND Händler = ?
order by vonSpanne DESC;         --absteigend Sortieren um die höchste dieser Preisspannen zu finden

Wobei man mit JPA bei der Query auch setMaxResults angeben kann und dann automatisch die richtige Variante gewählt werden sollte.


#10

Klappt :scream:

Cool, danke! Gut also kann ich mir ja die Spalte SpanneBis tatsächlich klemmen.