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

Sql Datenbank

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von scrabbler, 7 März 2014.

  1. scrabbler

    scrabbler Neuer Benutzer

    Hallo,

    In meiner Schule habe ich die Aufgabe bekommen eine Mysql Datenbank zu erstellen.

    Die mysql Datenbank beinhaltet verschiedene ATG Läufe z.b. Atg2011, Atg 2012. Bei jedem Lauf gibt es verschiedene Sportarten z.B. Schwimmen,Radfahren usw.

    Nun mein Problem:
    Mit der folgenden Datenbank kann man meines Erachtens nur einen Läufer eine Startnummer zu ordnen die er dann im lauf 2011 so wie im lauf 2012 hat. Jedoch sollte jeder Lauf eine Neuverteilung der Startnummern haben.

    Meine jetzige Datenbank sieht wie folgt aus:
    Unbenannt.PNG
    Wie kann man es machen das jeder Lauf eine neue Startnummerverteilung hat?

    Ich hoffe es war nicht allzu umständlich formuliert :D

    Mit freundlichen Grüßen
    Scrabbler
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Mir ist nicht klar, was Du mit der Frage meinst. Mir ist auch nicht klar, warum Du Fremdschlüssel über varchar(50) machen willst.
     
  3. ukulele

    ukulele Datenbank-Guru

    Wenn ich das richtig verstehe sind ATG2011 und 2012 Einträge von tbl_lauf. Die teilnehmenden, natürlichen Personen stehen in tbl_teilnehmer, und hier vermute ich auch deinen Fehler. tbl_teilnahme ist die Zwischentabelle die die n:m Beziehungen abbildet.

    Die Startnummer dürfte aber kein Atribut in tbl_teilnehmer sein sondern sollte ein Atribut von tbl_teilnahme sein.
     
  4. scrabbler

    scrabbler Neuer Benutzer

    Ist das dann nicht so das ich eventuell Zwei Läufern in einem Lauf die gleiche Startnummer geben könnte?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Laß mich kurz überlegen - nein. Laß sie doch einfach generieren und leg einen Unique Index drauf.
     
  6. scrabbler

    scrabbler Neuer Benutzer

    Ok wie lege ich den ein unique index ich höre es das erste mal
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# create table scrabbler (startnummer int unique);
    CREATE TABLE
    test=*# insert into scrabbler values (1);
    INSERT 0 1
    test=*# insert into scrabbler values (2);
    INSERT 0 1
    test=*# insert into scrabbler values (3);
    INSERT 0 1
    test=*# insert into scrabbler values (3);
    ERROR:  duplicate key value violates unique constraint "scrabbler_startnummer_key"
    DETAIL:  Key (startnummer)=(3) already exists.
    STATEMENT:  insert into scrabbler values (3);
    ERROR:  duplicate key value violates unique constraint "scrabbler_startnummer_key"
    DETAIL:  Key (startnummer)=(3) already exists.
    test=*#
    
     
  8. ukulele

    ukulele Datenbank-Guru

    In jedem Fall gehört die Startnummer als Atribut in die Zwischentabelle. Über einen Constraint kann man dann sicherstellen das eine Startnummer eindeutig bleibt.

    Ich denke die "Schullösung" wäre zunächst ein mehrteiliger PK auf der Tabelle tbl_teilnahme. Wenn dein PK z.B. aus den Spalten fk_Lauf und der Startnummer besteht muss die Nummer pro Lauf eindeutig sein. In der Praxis würde ich das nicht so machen weil mir künstliche und vor allem einspaltige Schlüssel viel lieber sind aber in der Theorie wird sowas gerne gemacht.
     
  9. Hony%

    Hony% Datenbank-Guru

    Dadurch kann sich allerdings die Semantik ändern und du brauchst zusätzliche Constraints. Im schlimmsten Fall muss die Anwendung die Einhaltung diverser Einschränkungen garantieren.
     
  10. scrabbler

    scrabbler Neuer Benutzer

    So habe jetzt versucht es hinzubekommen. Anstatt des UNIQUE hab ich einen kombinierten PK aus läufer_ID und Startnummer verwendet.

    Geht das so ;D?

    Und bei der Beziehung von Sponsorteilnahme und Teilnahme kann man das auch so hinbekommen das man anstatt eines INT Wertes den Namen des Sponsors angezeigt bekommt?

    Tut mir Leid wenn die Fragen eventuell was dumm rüberkommen aber bin gerade erst dabei sql zu lernen :/

    Code:
    DROP DATABASE IF EXISTS Atg2012;
    CREATE DATABASE Atg2012;
    USE Atg2012;
    
    SET FOREIGN_KEY_CHECKS=0;
    
    CREATE TABLE tbl_Verein
    (
    pk_Verein VARCHAR (50),
    PRIMARY KEY(pk_Verein)
    )
    ENGINE=INNODB;
    
    CREATE TABLE tbl_Geschlecht
    (
    pk_Geschlecht CHAR (1),
    PRIMARY KEY(pk_Geschlecht)
    )
    ENGINE=INNODB;
    
    CREATE TABLE tbl_Altersklasse
    (
    pk_Altersklasse VARCHAR(5),
    PRIMARY KEY(pk_Altersklasse)
    )
    ENGINE=INNODB;
    
    CREATE TABLE tbl_Lauf
    (
    pk_Lauf VARCHAR (30),
    PRIMARY KEY(pk_Lauf)
    )
    ENGINE=INNODB;
    
    CREATE TABLE tbl_Sponsor
    (
    pk_Sponsor VARCHAR (20),
    PRIMARY KEY(pk_Sponsor)
    )
    ENGINE=INNODB;
    
    CREATE TABLE tbl_Teilnahmesponsor
    (
    pk_TeilnahmesponsorID INT AUTO_INCREMENT,
    fk_Sponsor VARCHAR(20),
    fk_Startnummer INT,
    PRIMARY KEY(pk_TeilnahmesponsorID),
    FOREIGN KEY(fk_Sponsor)
    REFERENCES tbl_Sponsor(pk_Sponsor)
    ON DELETE NO ACTION
    ON UPDATE CASCADE
    )
    ENGINE=INNODB;
    
    Create Table tbl_Sportart
    (
    pk_Sportart varchar(40),
    Primary Key(pk_Sportart)
    )
    Engine=InnoDB;
    
    CREATE TABLE tbl_Teilnehmer
    (
    pk_TeilnehmerID INT AUTO_INCREMENT Primary Key,
    fk_Geschlecht CHAR (1),
    Name VARCHAR (25) NOT NULL,
    Vorname VARCHAR (25) NOT NULL,
    Geburtsdatum DATE NOT NULL,
    Zeit TIME,
    Platzierung_AK INT,
    PLatzierung INT,
    FOREIGN KEY(fk_Geschlecht)
    REFERENCES tbl_Geschlecht(pk_Geschlecht)
    ON DELETE NO ACTION
    ON UPDATE CASCADE
    )
    ENGINE=INNODB;
    
    CREATE TABLE tbl_Teilnahme
    (
    Startnummer INT,
    fk_TeilnehmerID INT,
    fk_Sponsor INT,
    fk_Altersklasse VARCHAR (5) NOT NULL,
    fk_Lauf VARCHAR (20) NOT NULL,
    fk_Verein VARCHAR(50),
    fk_Sportart VARCHAR(40),
    PRIMARY KEY(Startnummer,fk_Lauf),
    FOREIGN KEY(fk_Sponsor)
    REFERENCES tbl_teilnahmesponsor(pk_TeilnahmesponsorID)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
    FOREIGN KEY(fk_Altersklasse)
    REFERENCES tbl_Altersklasse(pk_Altersklasse)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
    FOREIGN KEY(fk_Lauf)
    REFERENCES tbl_Lauf(pk_Lauf)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
    FOREIGN KEY(fk_Verein)
    REFERENCES tbl_Verein(pk_Verein)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
    FOREIGN KEY(fk_Sportart)
    REFERENCES tbl_Sportart(pk_Sportart)
    ON DELETE NO Action
    ON UPDATE CASCADE,
    FOREIGN KEY(fk_TeilnehmerID)
    REFERENCES tbl_Teilnehmer(pk_TeilnehmerID)
    ON DELETE NO Action
    ON UPDATE CASCADE
    )
    ENGINE=INNODB;
    
    
    
    INSERT INTO tbl_Sponsor (pk_Sponsor)
    VALUES
    ('Adidas'),
    ('Nike'),
    ('bla');
    
    
    INSERT INTO tbl_Sportart (pk_Sportart)
    VALUES
    ('Laufen'),
    ('Schwimmen'),
    ('Springen');
    
    
    INSERT INTO tbl_Altersklasse (pk_Altersklasse)
    VALUES
    ('m35'),
    ('m35'),
    ('w35');
    
    INSERT INTO tbl_Geschlecht (pk_Geschlecht)
    VALUES
    ('m'),
    ('w');
    
    INSERT INTO tbl_Lauf (pk_Lauf)
    VALUES
    ('atg2011'),
    ('atg2012'),
    ('atg2013');
    
    INSERT INTO tbl_Verein (pk_Verein)
    VALUES
    ('Mausklub'),
    ('Katzenklub');
    
    LOAD DATA LOCAL INFILE 'E:/Teilnehmer.txt' INTO TABLE tbl_Teilnehmer FIELDS TERMINATED by ';';
    LOAD DATA LOCAL INFILE 'E:/Teilnahme.txt' INTO TABLE tbl_Teilnahme FIELDS TERMINATED by ';';
    
    
    
     
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