Sql Datenbank

scrabbler

Neuer Benutzer
Beiträge
4
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
 
Werbung:
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.
 
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.

Ist das dann nicht so das ich eventuell Zwei Läufern in einem Lauf die gleiche Startnummer geben könnte?
 
Ok wie lege ich den ein unique index ich höre es das erste mal
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=*#
 
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.
 
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.

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.
 
Werbung:
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 ';';
 
Zurück
Oben