Euromünzen Datenbank

Markus92

Aktiver Benutzer
Beiträge
30
Hallo,

Ich möchte eine Datenbank für Euro-Münzen (1ct-2€) nach Jahr und Herkunftsland erstellen.
Außerdem sollen alle 2€ Gedenkmünzen in die Datenbank.

Dachte an Folgendes:
T11:Kursmünzen (1ct-2€)
ID int primary_key auto_increment
Nominalwert in cent int
fk_Land int
Sonderbuchstabe varchar(10)
Wert in cent int
Motiv varchar(max)
Jahr int
Besitz bit

T13:Land
ID int primary_key auto_increment
Land varchar(100)

T21:Gedenkmünzen (2€)
ID int primary_key auto_increment
fk_Land int
Datum date
Sonderbuchstabe varchar(10)
Wert in cent int
Anliegen varchar(max)
Besitz bit

T22:Land
ID int primary_key auto_increment
Land varchar(100)

Nun mein Problem bei T11: Es kann pro jahr aus einem Land mehrere Münzen mit dem selben nominalwert geben mit verschiedenen Sonderbuchstaben oder Motiven.
Ich weiß nicht wie ich das in Tabellen am besten Darstellen kann.
 
Werbung:
T11 würde dann wie folgt gefüllt:
ID NW fk_L SB Wert Motiv Jahr Bestitz
1 1 1 A 100 Ahornblatt 2002 true
2 1 1 D 100 Ahornblatt 2002 true

T12
ID Land
1 Deutschland

Ich bin mir da nicht sicher ob das irgendwie noch zu verbessern geht..
 
Vielleicht Nominalwert, Motiv und Jahr in eine extra Tabelle ausklammern da weiß ich aber nicht ob das wirklich sinnvoll ist...
 
Punkt 1: Zwei Tabellen für die gleiche logische Einheit (Münze) ist einfach unsinnig
Punkt 2: Was hindert dich daran für das gleiche Jahre mehrere Münzen anzulegen? Immerhin hast du eine Münzen-ID ? Das ist eine eindeutige Id... Oder nicht?
 
Ok, hab nochmal drüber nachgedacht und eine denke ich verbesserte Version
T1:Münze
ID int primary_key auto_increment
fk_Nominal_Land
Sonderbuchstabe varchar(10)
Wert in cent int
Jahr int
Besitz bit

T2: Nominal_Land
ID int primary_key auto_increment
Nominalwert in cent int
fk_Land int
fk_Motiv int
Gedenkmünze bit

T3: Land
ID int primary_key auto_increment
Land varchar(100)

T4:Motiv
ID int primary_key auto_increment
Motiv varchar(1000)
Beschreibung Motiv varchar(max)

Falls gewünscht kann ich nochmal ein Beispiel erstellen.
Denke das müsste jetzt fasst so passen
 
Werbung:
Ich habe die Datenbank jetzt erstellt und auch schon mit Daten gefüllt.
Hier mal die Struktur:
Code:
--
-- Datenbank: `muenzen`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `besitz`
--

CREATE TABLE IF NOT EXISTS `besitz` (
  `ID` int(11) NOT NULL,
  `fk_Nominal_Land` int(11) NOT NULL,
  `fk_Sonder` int(11) DEFAULT NULL,
  `Wert` decimal(6,2) DEFAULT NULL,
  `Jahr` int(11) NOT NULL,
  `Auflage` int(11) DEFAULT NULL,
  `Besitz` bit(1) NOT NULL,
  `KMS` bit(1) NOT NULL DEFAULT b'0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `land`
--

CREATE TABLE IF NOT EXISTS `land` (
  `ID` int(11) NOT NULL,
  `land` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `motiv`
--

CREATE TABLE IF NOT EXISTS `motiv` (
  `ID` int(11) NOT NULL,
  `Motiv` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_mysql500_ci NOT NULL,
  `Beschreibung` mediumtext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `nominal_land`
--

CREATE TABLE IF NOT EXISTS `nominal_land` (
  `ID` int(11) NOT NULL,
  `Nominalwert` decimal(3,2) NOT NULL,
  `fk_land` int(11) NOT NULL,
  `fk_motiv` int(11) NOT NULL,
  `Prägebeginn` int(11) NOT NULL,
  `Prägeende` int(11) DEFAULT NULL,
  `Bild` text,
  `Gedenkmünze` bit(1) NOT NULL DEFAULT b'0',
  `GM_ID` int(11) DEFAULT NULL,
  `Ausgabedatum` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `sonder`
--

CREATE TABLE IF NOT EXISTS `sonder` (
  `ID` int(11) NOT NULL,
  `Buchstabe` varchar(10) NOT NULL,
  `Bedeutung` varchar(1000) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indizes der exportierten Tabellen
--

--
-- Indizes für die Tabelle `besitz`
--
ALTER TABLE `besitz`
  ADD PRIMARY KEY (`ID`),
  ADD KEY `fk_Nominal_Land` (`fk_Nominal_Land`),
  ADD KEY `fk_Sonder` (`fk_Sonder`),
  ADD KEY `fk_Sonder_2` (`fk_Sonder`);

--
-- Indizes für die Tabelle `land`
--
ALTER TABLE `land`
  ADD PRIMARY KEY (`ID`);

--
-- Indizes für die Tabelle `motiv`
--
ALTER TABLE `motiv`
  ADD PRIMARY KEY (`ID`);

--
-- Indizes für die Tabelle `nominal_land`
--
ALTER TABLE `nominal_land`
  ADD PRIMARY KEY (`ID`),
  ADD KEY `fk_land` (`fk_land`),
  ADD KEY `fk_motiv` (`fk_motiv`);

--
-- Indizes für die Tabelle `sonder`
--
ALTER TABLE `sonder`
  ADD PRIMARY KEY (`ID`);

--
-- AUTO_INCREMENT für exportierte Tabellen
--

--
-- AUTO_INCREMENT für Tabelle `besitz`
--
ALTER TABLE `besitz`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `land`
--
ALTER TABLE `land`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `motiv`
--
ALTER TABLE `motiv`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `nominal_land`
--
ALTER TABLE `nominal_land`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `sonder`
--
ALTER TABLE `sonder`
  MODIFY `ID` int(11) NOT NULL AUTO_INCREMENT;
--
-- Constraints der exportierten Tabellen
--

--
-- Constraints der Tabelle `besitz`
--
ALTER TABLE `besitz`
  ADD CONSTRAINT `besitz_ibfk_1` FOREIGN KEY (`fk_Nominal_Land`) REFERENCES `nominal_land` (`ID`),
  ADD CONSTRAINT `besitz_ibfk_2` FOREIGN KEY (`fk_Sonder`) REFERENCES `sonder` (`ID`);

--
-- Constraints der Tabelle `nominal_land`
--
ALTER TABLE `nominal_land`
  ADD CONSTRAINT `nominal_land_ibfk_1` FOREIGN KEY (`fk_land`) REFERENCES `land` (`ID`),
  ADD CONSTRAINT `nominal_land_ibfk_2` FOREIGN KEY (`fk_motiv`) REFERENCES `motiv` (`ID`);

Jetzt mache ich darauf eine Abfrage die eher schlecht als Recht funktioniert:
Code:
Select distinct a.Land, besitz.Jahr, a.besitz, a.kms, a.Auflage, b.besitz, b.kms, b.Auflage, c.besitz, c.kms, c.Auflage, d.besitz, d.kms, d.Auflage, e.besitz, e.kms, e.Auflage, f.besitz, f.kms, f.Auflage, g.besitz, g.kms, g.Auflage, h.besitz, h.kms, h. Auflage, i.besitz, i.kms, i.Auflage, a.Buchstabe from besitz,Sonder, (select Buchstabe, fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz left outer join Sonder on fk_Sonder=Sonder.ID, Nominal_Land, Land where Nominalwert=0.01 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land) as a, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=0.02 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land) as b, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=0.05 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land) as c, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=0.10 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land) as d, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=0.20 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land) as e, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=0.50 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land) as f, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=1.00 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land) as g, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=2.00 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land and Gedenkmünze=0) as h, (select fk_Sonder, land.land, Jahr, besitz, kms, Auflage from besitz, Nominal_Land, Land where Nominalwert=2.00 and fk_Nominal_Land=Nominal_Land.ID and Land.ID=Nominal_Land.fk_Land and Gedenkmünze=1 and GM_ID=1) as i where a.Jahr=besitz.Jahr and a.Land=b.Land and a.Land=c.Land and a.Land=d.Land and a.Land=e.Land and a.Land=f.Land and a.Land=g.Land and a.Land=h.Land and (a.Land=i.Land or i.Land is NULL) and ((a.fk_Sonder=b.fk_Sonder and a.fk_Sonder=c.fk_Sonder and a.fk_Sonder=d.fk_Sonder and a.fk_Sonder=e.fk_Sonder and a.fk_Sonder=f.fk_Sonder and a.fk_Sonder=g.fk_Sonder and a.fk_Sonder=h.fk_Sonder and (a.fk_Sonder=i.fk_Sonder or i.fk_Sonder is NULL)) or (a.fk_Sonder is NULL and b.fk_Sonder is NULL and c.fk_Sonder is NULL and d.fk_Sonder is NULL and e.fk_Sonder is NULL and f.fk_Sonder is NULL and g.fk_Sonder is NULL and h.fk_Sonder is NULL and i.fk_Sonder is NULL)) and b.Jahr=besitz.Jahr and c.Jahr=besitz.Jahr and d.Jahr=besitz.Jahr and e.Jahr=besitz.Jahr and f.Jahr=besitz.Jahr and g.Jahr=besitz.Jahr and h.Jahr=besitz.Jahr and (i.Jahr=besitz.Jahr or i.Jahr is NULL) order by a.Land, besitz.Jahr, a.fk_Sonder

Ziel des ganzen ist es für jedes Jahr nach Land gruppiert die Nominalien von 1ct bis 2€ anzuzeigen daneben noch die 0-3 Gedenkmünzen.
Probleme dabei: Es gibt keine Münze die immer geprägt wird, heißt es können Jahre sei wo ein Land nur die 2€ normal prägt sonst weder 1ct-2€ noch eine Gedenkmünze oder es werden auch mal alle 11 Münzen geprägt.
obige Abfrage ist bisher nur für 8 Münzen und eine Gedenkmünze...
durch den inner join zwischen a und i gibt es aber nur in den jahren mit gedenkmünze eine ausgabe für das jewilige Land.
Außerdem ist die Performance auch unterirdisch schlecht...
 
Zurück
Oben