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

Totaler Anfänger - paar Fragen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Gary12345, 12 April 2013.

  1. Gary12345

    Gary12345 Benutzer

    Hallo,

    ich besuche die 9te Klasse eines Gymnasiums und versuche mir SQL selber beizubringen, da mir das gefällt und ich das auch in der Schule können muss. Da wir in gut 3 Wochen eine Arbeit schreiben, will ich unbedingt mit selbst SQL aneignen und natürlich auch eine gute Note erzielen. Rein privat programmiere ich in Python und in XPROFAN (damit habe ich aber zurzeit aufgehört).

    Es handelt sich um eine Aufgabe, die wir demnächst im Unterricht korregieren werden, die dazu verhilft, eine eigene Datenbank zu erstellen, zu planen und richtig zu strukturieren.

    Es ist nicht so, dass ich nichts verstehe , sondern will wissen, ob mein Gedankengang richtig ist.

    Aufgabe:
    In einer Stadt gibt es mehrere Videotheken XVIEW (Tel 12345), YVIEW(Tel 56789) und ZVIEW(Tel 192837). XVIEW liegt in Xantipelleallee, YVIEW in Ypsweg und ZVIEW in der Zeppelinstraße. Jede Videothek wird von genau einem Mitarbeiter geleitet. Dabei haben alle Leiter von Videotheken unterschiedliche Namen, einen Vornamen und ein Gehalt.
    Jede Videothek vertreibt mehrere Filme aber immer nur eines bestimmten Genres: XVIEW - Abenteuerfilme, YVIEW - Märchenfilme und ZVIEW - Musikfilme. Jeder dieser Filme hat eine Kurzbezeichnung und einen Herstellert. Von einem Film stehen in einer Videothek mehrere Exemplare zur Ausleihe bereit. Kunden mit Namen und Vornamen können sich in der Videothek ein oder mehrere Filme ausleihen.

    1. Erstelle ein ER-Diagramm
    - dazu gehört: Entitäten mit Attributen, Relationen, Kardinalitäten, Primärschlüssel


    [​IMG]


    Das habe ich bereits meinem Lehrer gezeigt. Er hatte mir Recht gegeben. Daher denke ich auch, dass das so OK ist.

    2. Erstelle ein Datenbankschema!
    - dazu gehört: Tabellenentwurf für Entitäten und Relationen
    - Tabellenname, Attribut-Spaltennamen mit Typ, Primär-/Sekundärschlüssel

    Meine dazugehörige Lösung (da bin ich mir etwas unsicher):

    rot = Primärschlüssel blau = importierter Fremdschlüssel

    Mitarbeiter(Name : Varchar(30); Gehalt : Int; Vorname : Varchar(30))
    Videothek(Telefonnr : Int; Ort : Varchar(20); Name2 : Varchar(30); Name : Varchar(30))
    Filme(Kurzbezeichnung : Varchar(20); Hersteller : Varchar(30); Genre : Varchar(20); Telefonnr : Int)
    Kunden(ID : Int; Vorname : Varchar(20); Name: Varchar(20); Kurzbezeichnung : Varchar(20))
    Verleihen(Kurzbezeichnung : Varchar(20); ID : Int)

    Nun - ich habe die für die Relation "Verleihen" eine Tabelle erstellt, weil es eine n:m Beziehung ist, dass heist, dass keine Vereinfachung möglich ist.

    Dabei wäre meine Frage, ob dies richtig ist.

    3. Verfeinere das Datenbankschema!
    - Verfeinerung von 1:1
    - Verfeinerung von 1:n
    - sinnvoller Import der Sekundärschlüssel

    In Aufgabe 2 schon gemacht. Jedoch frage ich mich, ob ich die Sekundärschlüssel richtig importiert habe und was der Begriff "Sekundärschlüssel" eigentlich bedeutet.

    4. Setze das verfeinerte Datenbankschema in eine Datenbank mit SQL um!

    Dabei habe ich all diese Tabellen angelegt (Genau nach den Datenbankschema), jedoch weiss ich nicht, wie ich den "Code" abrufen kann, mit dem ich diese Datenbank erstellt habe.

    Wie kann man den Code einsehen?

    5. Fülle Deine Tabellen mit mindestens 5 Einträgen.

    Da ich blöderweise dazu ein Arbeitsblatt verloren habe, wusste ich nicht wie man Daten mit Hilfe eines Scripts einfügen kann. Deshalb habe ich die Datenbank geöffnet und habe dabei einen Eintrag eingetragen.Da ich wieder nicht auf die Idee gekommen bin, nach den richtigen Befehlen zu googlen, werde ich es natürlich demnächst machen!

    Wenn ich den Eintrag in die Tabelle Mitarbeiter einfüge, müsste doch dieser Schlüssel doch auch in der Tabelle Videothek sein, weil ich den Schlüssel der Datenbank Mitarbeiter ind die Datenbank Videothek importiert habe? -> Schlüssel nicht zu sehen
    Ich denke zwar, dass ich weiss, wass "Fremdschlüssel importieren" bedeutet, jedoch will ich auf Nummer sicher gehen und diese Sache von einem Profi erklären lassen.

    Eine Frage, die nicht zur Aufgabe gehört:
    Es geht um das Thema Kardinalitäten. Jetzt unterrichten n Lehrer m Klassen. Ist das dann auch gleich, wenn man das m Lehrer nennt wie z.B. Jetzt unterrichten m Lehrer n Klassen. Schon, oder?

    Das wars vorerst! Freue mich auf Antwort!

    Liebe Grüße
    -Gary
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Löblich, von der Wahl der DB mal abgesehen, aber das ist sicher nicht Deine Entscheidung ;-)


    Das Name in Videothek soll dann auf den Mitarbeiter referenzieren, oder? Okay. Telefonnummer aber nicht als INT, weil die können auch Leerzeichen,/, + etc. enthalten.
    Man kann, muß aber nicht, den Mitarbeitern eine num. ID geben und diese als Schlüssel verwenden.

    Telefonnummer? Vermutlich willst Du Angaben zum hersteller etc. speichern, hier wäre eine extra Tabelle besser, denn ein Hersteller hat oft mehr als 1 Film, oder?

    Wie bildest Du ab, welcher Kunde nun welchen Fim hat? Bezieht sich Kurzbezeichnung in verleihen nun auf Kunden oder auf Filme?
    Wie bildest Du mehrere gleiche Filme ab?
    Wie bildest Du ab, welches Genre welche Videothek hat?

    MySQL und andere DB's haben dazu Clients, wo man z.B. reine Textdateien mit den Anweisungen reinkippen kann.

    Nur heute kostenfrei, der Google-Service: Insert

    In Mitarbeiter ist Name als PK definiert, in Videothek als Fremdschlüssel. Sofern Du bei MySQL die richtige Storage-Engine ausgewählt und die Syntax richtig hast, würde mit viel Glück dann MySQL prüfen, daß in Videothek im Feld Namen nur Werte vorkommen, die in Mitarbeiter definiert sind. Das nennt sich referentielle Integrität und wurde bei MySQL erst sehr spät erfunden.

    Kurzdemo:
    Code:
    test=# create table mitarbeiter(name text primary key);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "mitarbeiter_pkey" for table "mitarbeiter"
    CREATE TABLE
    Time: 100,339 ms
    test=*# create table videothek(mitarbeiter_name text references mitarbeiter);
    CREATE TABLE
    Time: 54,764 ms
    test=*# insert into mitarbeiter values ('Max');
    INSERT 0 1
    Time: 0,421 ms
    test=*# insert into videothek values ('Max');
    INSERT 0 1
    Time: 14,780 ms
    test=*# insert into videothek values ('Moritz');
    ERROR:  insert or update on table "videothek" violates foreign key constraint "videothek_mitarbeiter_name_fkey"
    DETAIL:  Key (mitarbeiter_name)=(Moritz) is not present in table "mitarbeiter".
    Time: 0,437 ms
    
    Achtung MySQL-Falle: MySQL akzeptiert den Code exakt auch so (create table - Befehle) und auch BEIDE Insert-Befehle in videothek. Die Syntax von mir ist 100% SQL-konform und funktioniert überall wie erwartet - außer in MySQL. Da mußt Du (sofern nicht 5.5 oder besser) expliziert InnoDB sagen und b) den Fremdschlüssel in der anderen Syntax definieren.
    Wenn Du das so machst wie ich wird MySQL die referentielle Integrität NICHT PRÜFEN.


    Ich sag mal so: man sieht, Du hast Dir Gedanken gemacht, aber noch nicht alles bedacht. Das wird schon ;-)
     
  3. Gary12345

    Gary12345 Benutzer

    Hi,

    Ich denke, ich habe einer der größten Fehler gemacht. Wenn ich jetzt mal Deinen Quellcode ansehe, verstehe ich 0. Wenn ich jedoch in dem Forum "Microsoft Server SQL" nachsehe, verstehe ich viel mehr. Ich denke, es kann gut sein, dass ich in der falschen Sektion bin. Aber : Uns wurde nur SQL gesagt, weder Microsoft Server SQL noch MySQL. Schließlich hies es: Wir programmieren jetzt in SQL. Kein weiteres Wort. Sehr hilfreich ist es schon, wenn man die Wichtigkeit von SQL erstmal verstehen muss! Ich kenne sehr viel Programmierer, die mit Python SQL programmieren (mit Hilfe eines Moduls) und daher interessiert es mich auch. Nicht nur wegen Python. Es ist halt viel einfacher, Daten zu managen. Das Problem ist nur wie man solche Datenbank "managt". Da ich ein ehrlicher Mensch bin, habe ich mich im ersten Halbjahr verschlechtert, stehe momentan auf eine 4 (!). Das ist aber auch nur wegen mir passiert, da ich einfach zu faul war und mir das damalige Thema "Tabellenkalkulationssysteme" gar nicht interessiert hatte. Aber ich freu mich (ehrlichgesagt) nächstes Jahr auf Java.

    Zu Aufgabe2)

    Ja, der Name in der Datenbank Videothek wird importiert aus der Mitarbeiter Datenbank. Somit referenziert Name der Datenbank Videothek den Namen aus Mitarbeiter. Man könnte dann Telefonnr als Varchar abspeichern? Und ja, man kann natürlich einen künstlichen Schlüssel erzeugen, jedoch denke ich, dass der natürliche Primärschlüssel "Name" auch ausreicht.

    Da hast Du recht.

    "Kurzbezeichnung" befindet sich ja in der Datenbank Film. In der Datenbank Kunden wir der Schlüssel "Kurzbezeichnung" doch importiert, oder nicht? Und durch diese Kurzbezeichnung bilde ich ab, welche Filme welcher Kunde besitzt. => Daher bezieht sich Kundenbezeichnung auf Kunde und auf Film?!

    Das ist das Problem. Ich weiss nicht wie.

    OK

    Ich mache mir sehr viele Gedanken. Die Umwandlung in Praxis holpert noch etwas.

    Da wir ja nicht wissen, welches SQL ich benutze, füge ich hier einen kleinen Beispielcode ein, der eine Tabelle erstellt:

    Code:
    create table schueler(
    schuelernr int not null primary key,
    name varchar(20),
    geb_am date
    );
    Falls das wirklich das falsche SQL ist, tut es mir furchtbar leid.

    Schöne Grüße aus Bayern
    -Gary
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Dir muß nix Leid tun, warum auch? Das funktioniert sowohl in MySQL (was Du vermutlich nutzt) und auch in PostgreSQL. Vermutlich auch in Oraggle und M$SQL und SQLite.

    MySQL ist halt in manchen Dingen arger Murks, da es z.T. Dinge, die der SQL-Standard definiert, auch so annimmt, aber sich einen Dreck drum schert, das zu realisieren.

    Code:
    Your MySQL connection id is 12465865
    Server version: 5.1.67 Source distribution
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> create table foobar(i int check i < 10);
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> insert into foobar values (22);
    Query OK, 1 row affected (0.06 sec)
    
    
    In PostgreSQL :

    Code:
    test=*# create table foobar(i int check (i < 20));
    CREATE TABLE
    Time: 36,025 ms
    test=*# insert into foobar values (22);
    ERROR:  new row for relation "foobar" violates check constraint "foobar_i_check"
    DETAIL:  Failing row contains (22).
    Time: 25,031 ms
    

    Was nützt es, wenn die DB die korrekte Syntax zur Prüfung auf < Wert zwar akzeptiert, das aber dann ignoriert?

    Andreas, grad wenig Zeit ...
     
  5. Gary12345

    Gary12345 Benutzer

    Hi,

    Ist eigentlich schon ziemlich blöd, wenn man nicht weiss, welches SQL man nutzt. Und dazu auch in LibreOffice Base wird nur SQL angegeben. Das ist verwirrend.

    Werde jetzt paar Tutorials abrattern, werde mich demnächst wieder melden, möchte aber dennoch gerne das Kapitel Objektorientierte Programmierung mit Python abschließen.

    Vielen Dank bis dahin!
     
  6. Gary12345

    Gary12345 Benutzer

    Wenn ich schon die Tuts ansehe wird mir schon schlecht, da haben wir ja nicht mal 1/4 besprochen. Mal sehen, ob ich das Importieren von Fremdschlüsseln wirklich verstehe.
     
  7. Gary12345

    Gary12345 Benutzer

    Jetzt sollte man sich Gedanken machen, wie und wo man Fremdschlüssel importiert. Habe nun ein schöneres ER-Daigramm gestaltet:
    [​IMG]

    Wir haben gelernt, dass man bei 1:1 und bei 1:n - Beziehungen die Relationstabellen weglassen kann, indem man Fremdschlüssel importiert. Bei einer n:m Beziehung eben nicht. Das würde bedeuten, dass ich die Relationstabelle "Verleiht" erstellen muss.

    Zuerst erstelle ich die erste Tabelle mit diesem Code (die Mitarbeitertabelle):
    Code:
    create table Mitarbeiter (
    Name Varchar(30) not null primary key,
    Gehalt int,
    Vorname Varchar(30)
    );
    Der Code funktioniert. Nun habe ich die Tabelle Mitarbeiter mit den drei Attributen erstellt, eine davon ist der Primärschlüssel. Um die Relationstabelle zu vermeiden müsste ich doch den Primärschlüssel "Name" der Datenbank "Mitarbeiter" als Fremdschlüssel in die Datenbank "Videothek" importieren? Danach kann ich genau festlegen, welcher Mitarbeiter welche Videothek leitet? Habe ich recht?

    Der Code wäre dann:

    Code:
    create Table Videothek (
    Telefonnr int not null primary key,
    ort varchar(30),
    name_videothek varchar(30),
    name varchar(30),
    foreign key name references Mitarbeiter(name)
    );
    Dieser Code veranschaulicht, dass mit Hilfe der Funktion (ist das überhaupt eine Funktion?) ein Fremdschlüssel importiert wird. In diesem Fall wird der Schlüssel name aus der Tabelle Mitarbeiter importiert.

    Soweit richtig?

    Gehen wir mal lieber alles Schritt für Schritt an.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Das ist keine Funktion, sondern eine Definition. Da wird auch nix importiert, sondern der Datenbank gesagt, daß sie zu prüfen hat, daß es einen gleichen Eintrag in der Mitarbeiter-Tabelle zu geben hat.

    Andreas
     
  9. Gary12345

    Gary12345 Benutzer

    Und wurde gesagt, dass man mit der Definition (?) ForEign Key einen Fremdschlüssel aus einer anderen Tabelle importiert. Und wenn man dann in die Tabelle Mitarbeiter Werte einträgt, dann sollte es doch in der Tabelle Videothek auch den Wert name geben, da ich ihn ja importiert habe? Ich denke, ich versteh nicht so richtig, was importieren in SQL bedeutet.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Ich erstelle 2 Tabellen, master und slave. Master hat einen PK, slave einen Foreign Key auf master.
    Ich füge in master einen Wert ein und gugge, was dann in master und in slave steht:

    Code:
    test=# create table master(name text primary key);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
    CREATE TABLE
    test=*# create table slave (name text references master);
    CREATE TABLE
    test=*# insert into master values ('max');
    INSERT 0 1
    test=*# select * from master;
     name
    ------
     max
    (1 row)
    
    test=*# select * from slave;
     name
    ------
    (0 rows)
    
    Nun füge ich 2 Werte in slave ein, beachte bitte die Reaktion der DB:

    Code:
    test=*# insert into slave values ('max');
    INSERT 0 1
    test=*# insert into slave values ('moritz');
    ERROR:  insert or update on table "slave" violates foreign key constraint "slave_name_fkey"
    DETAIL:  Key (name)=(moritz) is not present in table "master".
    

    Nun a bissl klarer?


    Andreas
     
  11. Gary12345

    Gary12345 Benutzer

    Ich benutze LibreOffice Base und will Deinen Code da einfügen. Leider kommt eine Fehlermeldung: 1: Unexpected token: TEST in statement [test]

    Liegt es an MYSQL? Kennst Du ein gutes Einsteiger Tutorial?
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Oh mann...

    Code:
    test=#
    
    ist jeweils der Prompt der Datenbank. Meine Befehle sind immer die SQL-Befehle wie create table ... und select *.

    Andreas
     
  13. Gary12345

    Gary12345 Benutzer

    Sorry, habe ich einfach nicht gewusst. Morgen werde ich weiter lernen :)
     
    akretschmer gefällt das.
  14. Gary12345

    Gary12345 Benutzer

    Guten Tag,

    es tut mir leid, dass ich mich blöd anstelle, jedoch versuche ich Deinen Code zu interpretieren und in MySQL Code umzuwandeln.
    Code:
    test=# create table master(name text primary key);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
    CREATE TABLE
    test=*# create table slave (name text references master);
    CREATE TABLE
    test=*# insert into master values ('max');
    INSERT 0 1
    test=*# select * from master;
    name
    ------
    max
    (1 row)
     
    test=*# select * from slave;
    name
    ------
    (0 rows)
    Zuerst wird eine Tabelle erstellt, wobei text wohl falsch ist. Richtig wäre Varchar. Die zweite Zeile empfinde ich als Kommentar und wird vom Interpreter übersprungen, oder doch nicht?
    Und nach diesen Zeilen verstehe ich garnichts mehr.

    Was da gemacht wird, haben wir nicht besprochen. Wir haben nur besprochen, wie man Tabellen abfrägt, wie man sie erstellt und wie man Fremdschlüssel importiert. Mehr nicht.
     
  15. akretschmer

    akretschmer Datenbank-Guru

    Ich schreib mal mit -- beginnen Kommentare rein, okay?

    Falsch. Es ist noch eine Ausgabe der DB, keine Eingabe von mir.


    Andreas
     
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