PMG1719/DB Beleg/Max

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SQL</language>
== Themenwahl ==
In meinem Datenbankbeleg möchte ich die Umsetzung eines Rollenspiel-Videospieles realisieren.
Dieses Thema wählte ich, weil ich ???

== Modellierung der Datenbank ==

Entity Relationship Model (ERM)

[[Bild:Maxschloool_ERM_Screen.JPG]]
-

Konkretes Relationship Model (RM)

[[Bild:Maxschloool_RM_Screen.JPG]]

== Erstellung der Tabellen ==
<code id="5c41785ade45a">
DROP TABLE IF EXISTS SPIELER;
CREATE TABLE SPIELER(
  Player_ID int AUTO_INCREMENT,
  Username varchar(20),
  Level int,
  Erfahrung int,
  Lebenspunkte int,
  Coins int,
  Clan_ID int,
  Perk_ID int,
  PRIMARY KEY (Player_ID)
); 

DROP TABLE IF EXISTS CLAN;
CREATE TABLE CLAN(
  Clan_ID int AUTO_INCREMENT,
  Name varchar(20),
  Kapazitaet int,
  Levelgrenze int,
  Anfuehrer_ID int,
  PRIMARY KEY (Clan_ID)
); 


DROP TABLE IF EXISTS MONSTER;
CREATE TABLE MONSTER(
  Monster_ID int AUTO_INCREMENT,
  Name varchar(20),
  Erfahrung int,
  PRIMARY KEY (Monster_ID)
); 

DROP TABLE IF EXISTS PERK;
CREATE TABLE PERK(
  Perk_ID int AUTO_INCREMENT,
  Name varchar(20),
  Beschreibung varchar(128),
  Effekt_ID int,
  PRIMARY KEY (Perk_ID)
);

DROP TABLE IF EXISTS ITEM;
CREATE TABLE ITEM(
  Item_ID int AUTO_INCREMENT,
  Name varchar(20),
  Beschreibung varchar(128),
  Effekt_ID int,
  PRIMARY KEY (Item_ID)
); 

DROP TABLE IF EXISTS EFFEKT;
CREATE TABLE EFFEKT(
  Effekt_ID int AUTO_INCREMENT,
  Name varchar(20),
  Beschreibung varchar(128),
  PRIMARY KEY (Effekt_ID)
); 

DROP TABLE IF EXISTS besitzt;
CREATE TABLE besitzt(
  Player_ID int,
  Item_ID int
);

</code>

== Befüllen der Datensätze ==
<code id="5c417a2f3b656">
INSERT INTO SPIELER VALUES(1, 'Schloool', 100, 250, 10, 10000, 1, 2);
INSERT INTO SPIELER VALUES(2, 'ReitzOnTour', 23, 140, 10, 7346, 1, 1);
INSERT INTO SPIELER VALUES(3, 'Helmbrecher2001', 12, 0, 10, 50, NULL, NULL);
INSERT INTO SPIELER VALUES(4, 'BaytuzLP', 352, 254, 10, 152, 2, 1);
INSERT INTO SPIELER VALUES(5, 'AlbanerAlban', 13, 12, 10, 200, 3, 1);
INSERT INTO SPIELER VALUES(6, 'KokosPalme', 53, 234, 10, 1636, 3, 3);
INSERT INTO SPIELER VALUES(7, 'KillerSchulsprecher', 12, 250, 10, 10000, NULL, 1);
INSERT INTO SPIELER VALUES(8, 'Teichrose', 454, 250, 10, 16354524, 2, 4);
INSERT INTO SPIELER VALUES(9, 'FeuerFeuerFEEEEUER', 23, 52, 10, 434, 1, 1);
INSERT INTO SPIELER VALUES(10, 'JeckerJeschke', 47, 245, 10, 3433, 1, 3);
INSERT INTO SPIELER VALUES(11, 'NiedererSchuster', 32, 250, 10, 3672, 3, 2);
INSERT INTO SPIELER VALUES(12, 'Bobicar', 1, 0, 10, 0, NULL, NULL);
INSERT INTO SPIELER VALUES(13, 'Metal4Life', 100, 24, 10, 10000, 2, NULL);
INSERT INTO SPIELER VALUES(14, 'MakeGodsWordHappen', 140, 56, 10, 13060, 3, 4);

INSERT INTO CLAN VALUES(1, 'Schlossergilde', 10, 75, 1);
INSERT INTO CLAN VALUES(2, 'Hardcorezockerbande', 25, 75, 8);
INSERT INTO CLAN VALUES(3, 'Die Heidenverfolger', 20, 20, 14);

INSERT INTO MONSTER VALUES(1, 'Kanalratte', 10);
INSERT INTO MONSTER VALUES(2, 'Giftmettigel', 20);
INSERT INTO MONSTER VALUES(3, 'Gurkenfressender Eber', 50);
INSERT INTO MONSTER VALUES(4, 'Schweinebärmann', 100);
INSERT INTO MONSTER VALUES(5, 'Nacktmull mit Pollunder', 100);
INSERT INTO MONSTER VALUES(6, 'Kruseltier', 125);

INSERT INTO PERK VALUES(1, 'Schnelläufer', 'Lauf schneller als Usain Bolt!', 1);
INSERT INTO PERK VALUES(2, 'Hochspringer', 'Spring höher als ein afrikanischer Springfloh!', 2);
INSERT INTO PERK VALUES(3, 'Angreifer', 'Füge mehr Schaden als jemals zuvor zu!', 3);
INSERT INTO PERK VALUES(4, 'Verteidiger', 'Erhöhe deine Verteidigung signifikant!', 4);

INSERT INTO ITEM VALUES(1, 'Heiltrank', 'Heilt 5 Lebenspunkte', 5);
INSERT INTO ITEM VALUES(2, 'Laufschuhe', 'Deine Beine laufen wie von alleine', 1);
INSERT INTO ITEM VALUES(3, 'Fettes Stahlschild', 'Wehrt Angriffe besser ab', 4);
INSERT INTO ITEM VALUES(4, 'Schwert des Unterganges', 'Zerstört jeden kläglichen Gegner', 3);
INSERT INTO ITEM VALUES(5, 'Flügel des Icarus', 'Du lernst das Fliegen', 6);
INSERT INTO ITEM VALUES(6, 'Göffel', 'Küchenutensil mit spitzen Zinken', 3);

INSERT INTO EFFEKT VALUES(1, 'Geschwindigkeit', 'Erhöht Laufgeschwindigkeit');
INSERT INTO EFFEKT VALUES(2, 'Sprung', 'Erhöht Sprunghöhe');
INSERT INTO EFFEKT VALUES(3, 'Angriff', 'Erhöht Angriff');
INSERT INTO EFFEKT VALUES(4, 'Verteidigung', 'Erhöht Verteidigung');
INSERT INTO EFFEKT VALUES(5, 'Heilung', 'Erhöht Lebenspunkte');
INSERT INTO EFFEKT VALUES(6, 'Flug', 'Erlernt das Fliegen');

INSERT INTO besitzt VALUES(1, 2);
INSERT INTO besitzt VALUES(1, 3);
INSERT INTO besitzt VALUES(2, 5);
INSERT INTO besitzt VALUES(4, 1);
INSERT INTO besitzt VALUES(4, 2);
INSERT INTO besitzt VALUES(4, 4);
INSERT INTO besitzt VALUES(7, 3);
INSERT INTO besitzt VALUES(9, 2);
INSERT INTO besitzt VALUES(9, 3);
INSERT INTO besitzt VALUES(11, 2);
INSERT INTO besitzt VALUES(11, 5);
INSERT INTO besitzt VALUES(13, 1);
INSERT INTO besitzt VALUES(14, 2);
INSERT INTO besitzt VALUES(14, 4);
INSERT INTO besitzt VALUES(14, 6);
</code>

== Abfragen ==
'''Die dargebotenen Abfragen greifen alle auf die von mir entwickelte Datenbank zurück und sind in aufsteigender Komplexität angeordnet.'''
Vielleicht kann die eine oder andere Abfrage als Übungsstoff für Schüler dienen, die "Musterlösung" kann durch einen Klick auf das Kreuz in der linken oberen Ecke der Runbox jederzeit wiederhergestellt werden. Über die zusätzliche Box könnt ihr selbst kreativ werden und weitere (für ein Videospiel dieser Art) relevante Abfragen erstellen.

'''1) Welche Spieler sind im Spiel angemeldet?'''
<run id="5c4176f7cb145">SELECT * FROM SPIELER;</run>

'''2) Welche Monster gelten als bedrohlich, dh. lassen beim Tod mehr als 75 Erfahrungspunkte fallen?'''
<run>
SELECT * FROM MONSTER WHERE Erfahrung > 75;</run>

'''3) Was sind die 5 besten Spieler, dh. besitzen das höchste Level?'''
<run id="5c45fbe335bf2">
SELECT Username, Level LIMIT 5
FROM SPIELER
ORDER BY Level DESC
LIMIT 5;
</run>

'''4) Welche Clans (mit Namen und Kapazität) gibt es, und was sind ihre jeweiligen Anführer?'''
<run id="5c45fbe335c6b">
SELECT CLAN.Name, CLAN.Kapazitaet, SPIELER.Username AS Anführer
FROM CLAN, SPIELER
WHERE SPIELER.Player_ID = CLAN.Anfuehrer_ID;</run>

'''5) Welche Items besitzt der Spieler mit der ID 14?'''
<run id="5c4188a7afb0a">
SELECT ITEM.Name 
FROM SPIELER, ITEM, besitzt 
WHERE ITEM.Item_ID = besitzt.Item_ID AND besitzt.Player_ID = 14 AND SPIELER.Player_ID = 14;
</run>

'''6) Welche Eigenschaften (Name, Beschreibung, Effekt-ID) besitzen alle Perks und Items, die den Effekt "Angriff" nutzen?'''
Achtung: Die in der Musterlösung verwendete "UNION"-Anweisung komprimiert die Informationen verschiedener Tabellen in einer einzigen Spalte. In einer alternativen Lösung könnten diese Informationen zB. in lediglich einer Zeile angezeigt werden.
<run>
SELECT PERK.*
FROM PERK, EFFEKT
WHERE EFFEKT.Name = 'Angriff' AND PERK.Effekt_ID = EFFEKT.Effekt_ID

UNION

SELECT ITEM.*
FROM ITEM, EFFEKT
WHERE EFFEKT.Name = 'Angriff' AND ITEM.Effekt_ID = EFFEKT.Effekt_ID;
</run>

'''Box für freies Herumspielen am wahnsinnigen System'''
<run id="5c45f927503db"></run>

== Changelog ==

'''11.01.19'''
Konzeptidee, Skizzierung der ERM und RM in Dia, Anlegung der Tabellen im Wiki^

'''18.01.19''' 
Einfügen aller Grafiken, Einfüllen der Datensätze, Anlegung erster Abfragen und der Themenwahl, sowie nervenaufreibendes Fixen auftretender Fehler