PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum DB Design



deathb
14-04-2006, 17:37
Hi,

die Datenbank soll Ausleihvorgänge von Medien verschiedenster Art speichern, Medientypen sollen später einfach hinzugefügt werden können.

Bisher habe ich folgendes:

+ = PK, # = FK

Ausleiher: Name, Vorname, +Mitgliedsnummer
Exemplar: +Inventarnummer, Beschreibung, #MedientyTyp
Medientyp: +MedienTyp
Autoren: Name, Vorname, +AutorID
Buch: #AutorID, #Inventarnummer, #Beschreibung, ISBN
CDDVD: #AutorID, #Inventarnummer, #Beschreibung
Artikel: #AutorID, #inventarnummer, #Beschreibung
Ausleihvorgang: Ausleih Datum, Rückgabe Datum, #Mitgliedsnummer, #Inventarnummer


Da ich allerdings Neuling im DB Entwurf bin gibts da sicher noch Verbesserungen?

Julius

Romanday
15-04-2006, 08:49
Hi,

die Datenbank soll Ausleihvorgänge von Medien verschiedenster Art speichern, Medientypen sollen später einfach hinzugefügt werden können.

Bisher habe ich folgendes:

+ = PK, # = FK

Ausleiher: Name, Vorname, +Mitgliedsnummer
Exemplar: +Inventarnummer, Beschreibung, #MedientyTyp
Medientyp: +MedienTyp
Autoren: Name, Vorname, +AutorID
Buch: #AutorID, #Inventarnummer, #Beschreibung, ISBN
CDDVD: #AutorID, #Inventarnummer, #Beschreibung
Artikel: #AutorID, #inventarnummer, #Beschreibung
Ausleihvorgang: Ausleih Datum, Rückgabe Datum, #Mitgliedsnummer, #Inventarnummer


Da ich allerdings Neuling im DB Entwurf bin gibts da sicher noch Verbesserungen?

Julius

Das fehlt einiges. Auf die schnelle ist dein Artikel nicht richtig normalisiert worden. Den kannst du doch über z. B. MedienTyp <-> ArtikelId erreichen.
Deine Beschreibung sollte nur 1x vorkommen, und nicht an jeder Ecke
nochmals gespeichert werden.

Um es kurz zu machen... Ich vermute dir fehlt noch das Verständnis für
die 3. Normalform.

Xato
16-04-2006, 18:04
Ich würds so machen:
ausleiher: id(mitgliedsnr),name,vorname
medien: id,typ,inventar,isbn,beschreibung,ausleiher(=mitgl iedsnummer, 0 wenn nicht ausgeliehen),ausleihdatum,rückgabedatum

Romanday
16-04-2006, 20:58
Ich würds so machen:
ausleiher: id(mitgliedsnr),name,vorname
medien: id,typ,inventar,isbn,beschreibung,ausleiher(=mitgl iedsnummer, 0 wenn nicht ausgeliehen),ausleihdatum,rückgabedatum

Das funktioniert nur wenn die Cd, Video nur 1x
im Sortiment vorhanden ist. Und das ist doch bei einer
Videothek nicht der Fall!?

deathb
16-04-2006, 22:56
Hab das ganze überarbeitet, hier ist ein Bild der aktuellen Fassung:

home.pages.at/metalfan

bin grade dabei verschiedene Datensätze zu testen.

Julius

Romanday
16-04-2006, 23:33
Hab das ganze überarbeitet, hier ist ein Bild der aktuellen Fassung:

home.pages.at/metalfan

bin grade dabei verschiedene Datensätze zu testen.

Julius

Wie gesagt 3. Normalform.:D
Deine Medientypen sind noch nicht richtig normalisiert.
Longtext ist vielleicht ein bissle heftig, text reicht doch bestimmt aus?
Ein User ist doch ein Suplier, oder gibt es noch andere Arten von Usern?
Es fehlt noch die Darstellung der Beziehungen (1-1, 1-n usw.).
Wie willst Du dir alle DVDs der Kategorie Action anzeigen lassen?
Darf ein Autor z. B. ein Buch und eine DVD vertreiben, wenn ja wie
findest Du die?
item_All_Author ist überflüssig.

Turbohummel
17-04-2006, 08:43
An der Postleitzahl fällt mir was auf: Es können 2 Orte die gleiche PLZ haben. So zum Beispiel Aschaffenburg/Schweinheim und Gailbach. Beide 63743. Das ist bei dir nicht möglich.

deathb
17-04-2006, 11:21
Also die Spalte Typ hat zb die Werte AudioCD, DatenCD, DVD, Buch. Zusammen mit der Identity ist es doch machbar das man die Zahlen 1-4 in diesem Beispiel für Typen in der Tabelle Item verwendet?

select * from Mediatype;
+----------+---------+
| Identity | Type |
+----------+---------+
| 1 | DataCD |
| 2 | AudioCD |
| 3 | Book |
+----------+---------+

select * from Item;
+------------------------------------------------------------------------------------------------------+----------+------------------+---------------------+-------------------+---------------------------------------+
| Description | Identity | SupplierIdentity | CopyInventorynumber | MediatypeIdentity | Titel |
+------------------------------------------------------------------------------------------------------+----------+------------------+---------------------+-------------------+---------------------------------------+
| Jeder, der im Bereich Rechnernetze und Datenkommunikation tätig i
st... | 1 | 1 | 9 | 3 | Taschenbuch Rechnernetze und Internet |
| Vor ihr liegt ein Sommer, in dem | 2 | 2 | 2 | 3 | Sommerdiebe |
| Dieser eine Satz, mit dem er im Juli 1997 seinen Kapitän Jan Ullrich zum Tour-de-France-Sieg trieb, | 3 | 2 | 8 | 3 | Quäl dich du Sau |
| Es heißt das dritte Album ist die Feuertaufe..., | 4 | 3 | 7 | 2 | Coldplay |
| Stadium Arcadium führt den Weg der Peppers in aller Konsequenz fort: Herrlich aufputschendes F | 5 | 4 | 6 | 2 | Stadium Arcadium |
| test123test | 6 | 2 | 5 | 1 | Titeltest |
+------------------------------------------------------------------------------------------------------+----------+------------------+---------------------+-------------------+---------------------------------------+



Bei Datentypen hab ich erstmal nur zwschen Zahl und Text unterschieden, das wird noch angepasst.
Das ganze ist eine Schulbibliothek, ein User war erstmal mein erster Begriff für einen Schüler - die einzigste Kategorie die es also gibt ist Bildung. Der Supplier ist zB. eine Buchhandlung.
Autoren dürfen mehrer Medientypen geschrieben/erstellt haben.
Item_All_Author ordnet in jeder Zeile einem Item einen Author zu....dadurch kann ein Item von mehreren Authoren kommen.

Zum Auffinden aller Items eines Authors dessen Vorname = Helme oder Nachname = Helme

SELECT Surname, `First Name`, Type, Titel FROM `Item_All_Author`, Author, Item, Mediatype WHERE (((`Item_All_Author`.AuthorIdentity = Author.Identity) AND (`Item_All_Author`.ItemIdentity = Item.Identity) AND (Item.MediatypeIdentity = Mediatype.Identity)) AND ((Author.Surname = 'Helme') OR (Author.`First Name` = 'Helme')));
+---------+------------+--------+---------------------------------------+
| Surname | First Name | Type | Titel |
+---------+------------+--------+---------------------------------------+
| Helme | Heine | DataCD | Titeltest |
| Helme | Heine | Book | Taschenbuch Rechnernetze und Internet |
| Udo | Bölts | Book | Quäl dich du Sau |
+---------+------------+--------+---------------------------------------+


Wozu braucht man 1-1, 1-n,n-m überhaupt?

@turbohummel: durch Identity (auto_increment) sind die zeilen eindeutig

Turbohummel
17-04-2006, 12:35
Ich würde Identity weglassen, und einen aus "Name" und "PLZ" zusammengesetzten PK definieren.

Überhaupt gefällt mir der Name "Identity" nicht, ich würde stattdessen lieber "cd_id", "item_id" usw. verwenden.

deathb
17-04-2006, 13:59
Identity ist vielleicht ünglücklich gewählt, aber da bisher noch keine mysql abfrage gescheitert ist bin ich dabei geblieben...

Name und PLZ könnte es 2 mal geben;)

Turbohummel
17-04-2006, 18:25
Ähm, nö. Plz 11111 kann 2 Orte haben. Ein Ort kann in mehreren PLZs liegen.
Aber wozu zweimal eintragen: Ort1 liegt in PLZ-Bereich 11111?

Romanday
17-04-2006, 23:12
Ich würde Identity weglassen, und einen aus "Name" und "PLZ" zusammengesetzten PK definieren.


Dann gibt es keine 2 Schröder unter z.B. 12357?
Ist doch eine Schulbibliothek.
Die meisten Schüler wohnen doch nicht so weit von ihrer
Schule entfernt. Das kann es eventuell Probleme mit der PLZ geben.

Turbohummel
18-04-2006, 05:48
So wie ich das sehe, ist doch PLZ ne eigene Tabelle, oder, die von User aus referenziert wird.

Romanday
18-04-2006, 19:03
So wie ich das sehe, ist doch PLZ ne eigene Tabelle, oder, die von User aus referenziert wird.

Ja, klar, aber reicht ein PK aus Name und PLZ aus?

Turbohummel
18-04-2006, 20:25
Hast du so ein PLZ-Buch von der Post? Da steht genau drin, wie was wo wann eindeutig ist.
Die restlichen 1000 Seiten sind ne super Einschlafhilfe.

Romanday
18-04-2006, 21:03
Hast du so ein PLZ-Buch von der Post? Da steht genau drin, wie was wo wann eindeutig ist.


Nein leider nicht, nur veraltete Daten.
So weit ich weiß ist dies für große Unternehmen kein Problem an die
aktuellen Daten heranzukommen, bloß die kleinen Krauter bleiben
wieder außen vor.

Vielleicht kann jemand solche Daten mal posten?

Turbohummel
19-04-2006, 15:45
Die Daten gibts recht billig von der Regulierungsbehörde (CSV). Was sie genau kosten, weiß ich allerdings nicht.

deathb
23-04-2006, 15:34
Ich glaub Turbohummel hat da eine Datenredundanz gefunden...werde das mal in der Schule ansprechen.


Hab hier mal ne richtig interessante Abfrage, aus meiner Sicht als Anfänger :)
Siehe: home.pages.at/metalfan

SELECT * FROM `Item_All_Language` I3, Language L, `Item_All_Author` I2, Author A, Item I, Mediatype M, Copy C, Supplier S WHERE (((I2.AuthorIdentity = A.Identity) AND (I2 .ItemIdentity = I.Identity) AND (I.MediatypeIdentity = M.Identity) AND (I.CopyInventorynumber = C.Inventorynumber) AND (C.SupplierIdentity = S.Identity) AND (L.Identity = I3.LanguageIdentity)) AND ((I.Description LIKE '%Sommer%') OR (I.Identity LIKE '%Sommer%') OR (I.Titel LIKE '%Sommer%') OR (A.Surname LIKE '%Sommer%') OR (A.`First Name` LIKE '%Sommer%')));

Sozusagen ein Volltext Suche nach einem Begriff in verschiedenen Tabellen/Spalten, Myisam Tabellen haben zwar eine Volltextsuche inbegriffen aber die wird erstmal wegen InnoDB Tabellen (Fremdschlüssel) nicht verwendet.

Diese Anfrage liefer leider die Titel x mal zurück, für jeden Autor, jede Sprache alles was halt irgendwie mehrmals vorkommt gibts ein Ergebnis :(
Vorteil: man hat gleich alle Infos zum Treffern, Nachteil es werden schon bei meinen paar Büchern eine Menge Ergebnisse.

Gibts ne möglichkeit diese Abfrage in der Mysql Abfrage so zu manipulieren das er jeden Titel nur einmal ausgibt?

Turbohummel
23-04-2006, 16:56
Hallo,

ich hab mir diesen Wust jetzt net angesehen, aber versuch mal:

SELECT DISTINCT info1, info2, info3 ......

Ich würde nicht * benutzen, da du sicherlich sehr viele Felder hast.

Kleiner Tipp zur Schreibweise:


SELECT * FROM tabelle1 t1
JOIN tabelle2 t2 ON t1.wert = t2.wert
WHERE
t1.wert = "blub";

Sprich:
- Aufteilen auf mehrere Zeilen
- Einrücken bei komlexen Sachen
- alle Tabellen- und Spaltennamen klein schreiben
- MYSQL-Schlüsselwörter groß schreiben
- sprechende Aliase für Tabellennamen verwenden

macht Querys um vieles einfacher lesbar.