MySQL Datenbankmodell

baserider

Well-known member
ID: 174417
L
10 März 2007
682
23
Hi,

es gibt bei mir eine Tablle Kunde und eine Adressen, da der Kunde ja mehrere Adressen haben kann (Liefer- und Rechnungsadresse).
In der Kundentabelle gibt es Vorname und Name. Jedoch hat ja jede Adresse auch Vorname und Name.
Wenn ich jedoch aus der Kundentabelle die Spalten Vorname und Nachname rausnehme kann ich ja nur über die Adresstabelle auf den Namen des Kunden zugreifen. Gibts da ne gute Lösung? Wenn ich nur den Namen wissen will, ist ja die Adresstabelle nicht nötig.
 
Du kannst doch durchaus in der Kundentabelle den Namen speichern, und dafür in der Adressen-Tabelle nicht?

Und dann halt in der Adressen-Tabelle ein Feld "kunden-id" (o.ä.), und dann kannste du dir über ein JOIN oder ein SELECT über mehrere Tabellen die Daten holen, wenn du alles brauchst..
 
Du kannst doch durchaus in der Kundentabelle den Namen speichern, und dafür in der Adressen-Tabelle nicht?

Und dann halt in der Adressen-Tabelle ein Feld "kunden-id" (o.ä.), und dann kannste du dir über ein JOIN oder ein SELECT über mehrere Tabellen die Daten holen, wenn du alles brauchst..

So wirds gemacht ^^
 
Du kannst doch durchaus in der Kundentabelle den Namen speichern, und dafür in der Adressen-Tabelle nicht?

ok, und was mache ich mit Liefer bzw. Rechnungsadresse? die können ja auch andere namen haben.Also muss ich ja in der Adress-Tabelle Felder für Vor- und Nachname vorsehen. Dann werden für die Standardanschrift die Felder einfach leer gelassen?
 
Tabelle Kunde enthält:
typ: varchar - Name
typ: varchar - Vorname
typ: varchar|text|long.... - Adressid's ( ist einfach folgendes: AID1|AID2|...|AIDx )

unter AIDx mit x=1..N verstehe ich folgendes:

AID1 ist Rechnungsadressdatensatz ID in der Tabelle Adressen
AID2 ist Lieferadressdatensatz ID in der Tabelle Adressen
AIDx ist Wohnadressdatensatz ID in der Tabelle Adressen
...

Du musst halt denn ein wenig programmieraufwand hinlegen, dass aus derm AID1|AID2|...|AIDx ein Array macht fürs handliche arbeiten und auch eben umgekehrt, wenn jemand eine Adresse einfügt, die vorher nicht schon drin steht, dann die AIDy mit einem '|' davor an den text oder varchar hinten einfach anhängen.

So würde ich es machen.
Man kann natürlich auch eine Relation zwischen dem Nutzer und seiner Adressen anlegen, was MySQL 5 durchaus auch kann.

Nur Tips von mir.
Wie Du es machst, ist Deine Entscheidung

Sobald ein Anderer Nutzer eine gleiche ID hat in der Adresstabelle, ist es dir in dem Fall wie ich es machen würde egal. Lädt aber zum Missbrauch ein.
Daher würde ich lieber prüfen, ob es eine Adresse dieser Art schon gibt, und den Eintrag verweigern, solange die Nutzer ID der AdressId's nicht gleich sind.
Du musst sowieso die Adressen durchlaufen, ob es diese schon gibt...
Die Operation ist nicht zu umgehen !
 
ich finde ja die erst genannte Lösung schon gut, nur frage ich mich ob man dann einfach für die Standardanschrift in der Adress-Tabelle die Felder vorname und nachname leer lässt und für die Liefer- und Rechnungsadresse dann die Felder füllt oder obs da ganz andere Ansätze gibt.
 
Ich wäre jetzt davon ausgegangen, dass der Kundenname an jeder Adresse gleich bleibt.

Wenn das nicht so ist würde ich halt noch einen Liefernamen in der anderen Tabelle speichern. Leer lassen oder nicht ist wurscht, die paar Byte dürfte deine Tabelle noch vertragen, also nimms lieber mit auf, ist dann besser lesbar!
 
Du musst natürlich auch wenn der Kunde seine Standardanschrift benutzt, diese zu jeder Bestellung speichern. Denn wenn der Kunde oder du als Admin irgendwann später die Bestellungen des Kunden ansiehst und er ist mittlerweile umgezogen (und hat hoffentlich seine Adresse geändert), darf natürlich nicht in den alten Bestellungen (und damit verbunden evtl. auch Rechnungen, Lieferscheinen) die neue Adresse stehen. Das gleiche gilt natürlich für den Namen auch, z.B. durch Heirat kann sich dieser im Nachhinein ändern.
 
mir gehts ja erstmal auch darum gehört der name zur adresse oder zum kunden und das ist mir bei der standardadresse nicht so klar. denn wenn ich in der adresstabelle und der kundentabelle den namen ablege sind das ja redundante daten.
 
mir gehts ja erstmal auch darum gehört der name zur adresse oder zum kunden und das ist mir bei der standardadresse nicht so klar. denn wenn ich in der adresstabelle und der kundentabelle den namen ablege sind das ja redundante daten.

Aus meiner Sicht sind das nicht die gleichen Daten.

Der Name gehört zum Kunden.
Bei der Adresse verwende ich die Bezeichnung "Anschrift".

Bei der Eingbe wird ein Vorschlag für die Anschrift angeboten, der aus den Kundenfeldern Anrede, Titel und Name abgeleitet wird. Der Benutzer kann die Anschrift natürlich überschreiben.
 
Ein einfaches Beispiel sind lange Doppelnamen plus Titel.
Das wird dann leicht zu lang für das Fenster im Kuvert. Am besten entscheidet da der User, wo er abkürzen soll.

Es ist zwar in beiden Fällen der gleiche Name, aber die Schreibweise ist verschieden.
 
mir gehts ja erstmal auch darum gehört der name zur adresse oder zum kunden[..]

Wenn ich so an Amazon denke kann man dort zu jeder Adresse noch mal Vor-/Nachname angeben. Somit wird dort wohl einmal zu jedem Kunde FEST der Name gespeichert und dann für jede Adresse zusätzlich auch noch einmal.
Also auch wenn man nur eine Adresse angegeben hat findet man zweimal Vor-/Nachnamen in der Datenbank.
 
Tabelle Kunde enthält:
typ: varchar - Name
typ: varchar - Vorname
typ: varchar|text|long.... - Adressid's ( ist einfach folgendes: AID1|AID2|...|AIDx )

unter AIDx mit x=1..N verstehe ich folgendes:

AID1 ist Rechnungsadressdatensatz ID in der Tabelle Adressen
AID2 ist Lieferadressdatensatz ID in der Tabelle Adressen
AIDx ist Wohnadressdatensatz ID in der Tabelle Adressen
...

Du musst halt denn ein wenig programmieraufwand hinlegen, dass aus derm AID1|AID2|...|AIDx ein Array macht fürs handliche arbeiten und auch eben umgekehrt[...]

Eigentlich macht man das genau andersherum :

Tabelle-Kunden:
type: int - id
type: varchar - name
type: varchar - vorname

Tabelle-AbsendeAdressen:
type: int - id
type: int - kundenId
type: varchar - name
type: varchar - vorname
type: varchar - plz ...usw.

Und schon kann man mit einem einfachen JOIN die Daten aus der Kunden- und AbsendeAdressen-Tabelle holen:

So in etwa:
Code:
SELECT * FROM `kunden` AS `k`
LEFT JOIN `absendeAdressen` AS `a`
  ON `a`.`kundenId` = `k`.`id`
WHERE `k`.`id`=5
 
Wenn ich so an Amazon denke kann man dort zu jeder Adresse noch mal Vor-/Nachname angeben. Somit wird dort wohl einmal zu jedem Kunde FEST der Name gespeichert und dann für jede Adresse zusätzlich auch noch einmal.
Also auch wenn man nur eine Adresse angegeben hat findet man zweimal Vor-/Nachnamen in der Datenbank.

jup, immerhin kann ich ja auch etwas in Amazon bestellen und an andere Personen schicken lassen (normal oder als Geschenk), von daher sollten die Daten des Kunden nur Kontaktadressen und zu jeder Bestellung kommt eben die Lieferadresse hinzu.
 
Naja, es kann viele Gruende haben dass der Username und die Addressaten namen nicht uebereinstimmen:
  • User bestellt etwas im Namen seiner Firma, und die Firma muss auf der Rechnung als Addressaten auftauchen (Steuer belege, Buchhaltung, ...) heisst die Rechnungsadresse hat nicht denselben Namen
  • User bestellt etwas, ist aber fuer ein paar Tage bei einem Firmensitz im Ausland, und es muss dahingeschickt werden, also stimmt der Username mit der Lieferadresse nicht ueberein
Im Allgemeinen ist es eine schlechte Idee so etwas anzunehmen, und sollte nicht gemacht werden.

Man sagt dass der Name des Users und der Name in den Adressen unkorreliert sind.