Bedingte Felder in MySQL?
Yadgar
- datenbank
High!
Wie schon öfters hier angedeutet, arbeite ich an einer Datenbank für elektronische Orgeln (von den ersten Hammonds aus den 1930er Jahren bis zu den neuesten Digital-Modellen). Bei der Haupttabelle für die konkreten Orgelmodelle stellt sich das Problem, dass ich die Anzahlen der Register und Fußlagen sowie die Auslegung der Effekte pro Manual erfassen will, manche Orgeln jedoch mehr als zwei Manuale (tatsächlich bis zu vier) haben.
Grundsätzlich für alle Modelle auch Spalten für das dritte und vierte Manual vorzuhalten kommt mir wenig effizient vor - gibt es eine Möglichkeit, in MySQL bedingte Felder zu erzeugen? Unter den "Neben-Tabellen" gibt es nämlich in meiner Konzeption auch eine Tabelle "Klaviaturen", in der sämtliche meinen Recherchen zufolge überhaupt vorkommenden Arten von Pedalen und Manualen (also Bauart, tiefste und höchste Taste, Anzahl der Tasten) eingetragen sind. Standard-Elektronikorgeln mit zwei Manualen hätten in der zugehörigen Relationstabelle folglich drei Einträge (für Pedal, oberes und unteres Manual), Orgeln mit drei oder vier Manualen entsprechend mehr...
Bis bald im Khyberspace!
Yadgar
High!
Hail!
Nimm ein Blatt Papier, identifiziere die "realen" Entitäten mitsamt der notwendigen Attribute deiner Orgel(n) und wie sie in Beziehung zu einander stehen, mal dir das dann hübsch auf. Dann bekommst du eine solide Basis um daraus ein (ausreichend normalisiertes) Datenmodell zu machen. Die Entitäten (Objekte) werden zu Tabellen, die Attribute werden wahrscheinlich zu spalten. Dann kommen noch u.U. Tabellen für m:n Relationen dazu.
Die Beziehung zwischen Orgel und Manual wäre dann mindestens 1:n, was du in der Tabelle Manual durch einen Fremdschlüssel auf Orgel abbilden kannst.
Mach dir doch mal fix ein paar eigene Gedanken und stelle diese dann hier zur Diskussion. Dann können "wir" gezielte Rückfragen stellen, bzw. dich auf den richtigen Weg bringen. :)
Ciao, Frank
(Teil 1 der Antwort)
High!
Hail!
Oh, ein Schwarzmetaller/Neuheide/Mittelalter-Freak... (hoffentlich nicht jene Sorte, die man mit diesem Gruß leider auch identifiziert...)
Mach dir doch mal fix ein paar eigene Gedanken und stelle diese dann hier zur Diskussion. Dann können "wir" gezielte Rückfragen stellen, bzw. dich auf den richtigen Weg bringen. :)
O.k., here we are:
Haupttabelle "orgeln", gegenwärtiger Zustand:
+----------------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------+-----------------------+------+-----+---------+----------------+
| Nr | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| Hersteller | tinyint(3) | YES | | NULL | |
| Marke | tinyint(3) unsigned | YES | | NULL | |
| Modell | varchar(30) | YES | | NULL | |
| Alternativname | varchar(20) | YES | | NULL | |
| Markteinfuehrung | year(4) | YES | | NULL | |
| Produktion_Ende | year(4) | YES | | NULL | |
| Breite_cm | float(4,1) unsigned | YES | | NULL | |
| Hoehe_cm | float(4,1) unsigned | YES | | NULL | |
| Tiefe_cm | float(4,1) unsigned | YES | | NULL | |
| Gewicht | float(5,1) unsigned | YES | | NULL | |
| Typ | tinyint(2) | YES | | NULL | |
| Gehaeuseform | tinyint(2) | YES | | NULL | |
| Registerspeicher | smallint(3) unsigned | YES | | NULL | |
| Rhythmen | smallint(3) unsigned | YES | | NULL | |
| Sequenzer | mediumint(6) unsigned | YES | | NULL | |
| Akkordprogrammierung | smallint(5) | YES | | NULL | |
| Kniehebel | tinyint(1) | YES | | NULL | |
| MIDI | tinyint(1) unsigned | YES | | NULL | |
| Gesamtleistung | smallint(4) unsigned | YES | | NULL | |
| Verstaerkerleistung | smallint(4) unsigned | YES | | NULL | |
| Massenspeicher | tinyint(2) unsigned | YES | | NULL | |
+----------------------+-----------------------+------+-----+---------+----------------+
Teil 2 meiner Antwort:
Tabelle "gehaeuseformen":
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| Nr | tinyint(2) | NO | PRI | NULL | auto_increment |
| Gehaeuseform | varchar(25) | YES | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
mit den Einträgen:
+----+-------------------------+
| Nr | Gehaeuseform |
+----+-------------------------+
| 1 | Niedrig |
| 2 | Niedrig, Leichtbauweise |
| 3 | Spinett |
| 4 | Pseudo-Theater |
| 5 | Theater |
| 6 | Theater eckig |
| 7 | Sakral |
| 8 | Sakral hoch |
| 10 | Schräg, Leichtbauweise |
| 9 | Schräg |
| 11 | Combo niedrig |
| 12 | Combo halbniedrig |
| 13 | B-3 |
| 14 | Futuristisch |
+----+-------------------------+
Tabelle "hersteller", bis jetzt noch keine Einträge:
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| Nr | tinyint(3) | NO | PRI | NULL | auto_increment |
| Firmenname | varchar(60) | YES | | NULL | |
| Strasse | varchar(30) | YES | | NULL | |
| Hausnummer | smallint(5) | YES | | NULL | |
| PLZ_Zipcode | varchar(9) | YES | | NULL | |
| Postfach | varchar(9) | YES | | NULL | |
| Ort | varchar(30) | YES | | NULL | |
| Land | varchar(30) | YES | | NULL | |
| Status | tinyint(1) | YES | | NULL | |
| URL | tinytext | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
Teil 3 meiner Antwort:
Tabelle "klaviaturen":
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| Klaviatur_Nr | tinyint(3) | NO | PRI | NULL | auto_increment |
| Position | tinyint(1) | YES | | NULL | |
| Tiefste_Taste | varchar(2) | YES | | NULL | |
| Hoechste_Taste | varchar(2) | YES | | NULL | |
| Anzahl_Tasten | tinyint(2) | YES | | NULL | |
| Bauart | varchar(60) | YES | | NULL | |
+----------------+-------------+------+-----+---------+----------------+
mit den Einträgen:
+--------------+----------+---------------+----------------+---------------+---------------------------------------+
| Klaviatur_Nr | Position | Tiefste_Taste | Hoechste_Taste | Anzahl_Tasten | Bauart |
+--------------+----------+---------------+----------------+---------------+---------------------------------------+
| 1 | 0 | C | H | 12 | Stummel |
| 2 | 0 | C | c | 13 | Stummel |
| 3 | 0 | C | e | 17 | Stummel |
| 4 | 0 | C | f | 18 | Stummel |
| 5 | 0 | C | g | 20 | Stummel |
| 6 | 0 | C | c1 | 25 | Stummel |
| 7 | 0 | C | c1 | 25 | Voll, radial, horizontal geschweift |
| 8 | 0 | C | c1 | 25 | Voll. parallel |
| 9 | 0 | C | d1 | 27 | Voll, parallel |
| 10 | 0 | C | f1 | 30 | Voll, parallel |
| 11 | 0 | C | g1 | 32 | Voll, parallel, vertikal geschweift |
| 12 | 1 | c | c3 | 37 | vorspringend |
| 13 | 1 | F | f2 | 37 | vorspringend |
| 14 | 1 | F | a2 | 41 | vorspringend |
| 15 | 1 | F | c3 | 44 | vorspringend |
| 16 | 1 | C | g2 | 44 | vorspringend |
| 17 | 1 | F | e3 | 48 | vorspringend |
| 18 | 1 | C | c3 | 49 | vorspringend |
| 19 | 1 | C | g3 | 56 | vorspringend |
| 20 | 1 | C | h3 | 60 | Waterfall |
| 21 | 1 | C | c4 | 61 | vorspringend |
| 22 | 2 | c1 | c4 | 37 | vorspringend |
| 23 | 2 | f | f3 | 37 | vorspringend |
| 24 | 2 | F | a3 | 41 | vorspringend |
| 25 | 2 | f | c4 | 44 | vorspringend |
| 26 | 2 | c | g3 | 44 | vorspringend |
| 27 | 2 | c | c4 | 49 | vorspringend |
| 28 | 2 | F | f3 | 49 | vorspringend |
| 29 | 2 | C | g3 | 56 | vorspringend |
| 30 | 2 | C | h3 | 60 | vorspringend |
| 31 | 2 | C | c4 | 61 | vorspringend |
| 32 | 3 | F | c3 | 44 | vorspringend |
| 33 | 2 | c | f3 | 42 | vorspringend |
| 34 | 1 | C | c4 | 61 | Waterfall |
| 35 | 2 | C | c4 | 61 | Waterfall |
| 36 | 0 | C | g1 | 32 | Voll, parallel, horizontal geschweift |
| 37 | 0 | C | f1 | 30 | Voll, parallel, vertikal geschweift |
| 38 | 3 | c | c4 | 49 | vorspringend |
| 39 | 0 | C | f1 | 30 | Voll, parallel, doppelt geschweift |
| 40 | 1 | F1 | g4 | 75 | Waterfall |
| 41 | 3 | C | c4 | 61 | vorspringend |
| 42 | 0 | C | f1 | 30 | Stummel |
| 43 | 4 | C | c4 | 61 | vorspringend |
| 44 | 1 | C | c3 | 49 | Waterfall |
| 45 | 2 | c | c5 | 61 | vorspringend |
| 46 | 0 | C | f1 | 30 | Voll, parallel, horizontal geschweift |
| 47 | 1 | A | e3 | 44 | vorspringend |
| 48 | 0 | C | g1 | 32 | Voll, radial, vertikal geschweift |
| 49 | 1 | F | c3 | 44 | Waterfall |
| 50 | 2 | f | c4 | 44 | Waterfall |
| 51 | 3 | c1 | c4 | 37 | vorspringend |
| 52 | 3 | f | c4 | 44 | vorspringend |
| 53 | 1 | F | f3 | 49 | vorspringend |
| 54 | 1 | A | e3 | 44 | Waterfall |
| 55 | 0 | C | g1 | 32 | Voll, parallel |
| 56 | 1 | F | f2 | 37 | Waterfall |
| 57 | 2 | F | f2 | 37 | Waterfall |
| 58 | 0 | C | g1 | 32 | Voll, parallel, doppelt geschweift |
| 59 | 3 | f1 | c4 | 32 | vorspringend |
| 60 | 3 | F | c4 | 56 | vorspringend |
| 61 | 1 | C | e2 | 41 | vorspringend |
| 62 | 4 | C1 | h4 | 84 | Waterfall |
| 63 | 3 | c1 | c3 | 25 | vorspringend |
+--------------+----------+---------------+----------------+---------------+---------------------------------------+
Teil 4 meiner Antwort:
und schließlich die Tabelle "typ":
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| Nr | tinyint(2) | NO | PRI | NULL | auto_increment |
| Bezeichnung | varchar(25) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
mit den Einträgen:
+----+--------------------------+
| Nr | Bezeichnung |
+----+--------------------------+
| 1 | Einfachorgel |
| 2 | Heimorgel Unterklasse |
| 3 | Heimorgel Mittelklasse |
| 4 | Heimorgel Oberklasse |
| 5 | Profan-Pseudovollorgel |
| 6 | Profan-Vollorgel |
| 7 | Konzertorgel |
| 8 | Positiv |
| 9 | Sakral-Pseudovollorgel |
| 10 | Sakral-Vollorgel |
| 11 | Synthesizerorgel |
| 12 | Synthesizer-Konzertorgel |
| 13 | Comboorgel |
+----+--------------------------+
Wie gesagt, ich würde gerne irgendwie Felder für die Anzahl der Fußlagen sowie die Anzahl der Register für jedes vorhandene Pedal bzw. Manual hinzufügen, habe aber gegenwärtig keinen Plan, wie ich das hinbekommen soll - einfach eine weitere Tabelle mit allen nur möglichen Kombinationen von Manualzahlen und Fußlagenzahlen (bzw. Manualzahlen und Registerzahlen) kann es ja nicht sein, schon die Anzahl der Fußlagen kann für jedes Pedal bzw. Manual unabhängig voneinander zwischen 1 und 12 liegen, das wären nicht weniger als 1728 verschiedene Kombinationen, von den Registerzahlen gar nicht zu reden, die gehen bei modernen Digitalorgeln pro Manual ohne weiteres bis in die Hunderte, was etliche Millionen Kombinationen bedeuten würde...
Bis bald im Khyberspace!
Yadgar
Hi,
grundsätzlich sieht das schon gar nicht mal so schlecht aus. :)
Was sind Fußlagen?
Was sind Pedale? Was sind Manuale? Worin unterscheiden sich diese beiden? Kannst du mal bitte die hierarchische Ordnung für die Orgelteile auflisten?
Eine Orgel kann also mehrere Manuale mit jeweils unterschiedlicher Registeranzahl haben?
Dann kannst du der Entität Orgel einfach ein Attribut geben: Manuale / Pedale und da einfach die Anzahl eintragen.
In einer Tabelle "Manual" hast du dann wiederum ein Attribut "Registerzahl" und einen Fremdschlüssel auf die Orgel ...
[Manual]
--------------------------------------
Id, OrgelId, RegisterAnzahl, ManualTyp
--------------------------------------
1, 1, 47, 1
2, 1, 48, 2
3, 2, 133, 1
--------------------------------------
Da brauchst du gar nicht alle Kombinationen drin, sondern nur die Einträge für die Orgeln, die du verwaltest.
Für weitere Hierarchieebenen fügst du dann eine weitere (Kind)Tabelle mit jeweils einem Fremdschlüssel auf die (Eltern)Tabelle hinzu.
Ciao, Frank
Hello Yadgar,
ich schaue mir diesen Thread nun schon die ganze Zeit an.
Und dann dachte ich, der Mensch hat ein Klassifizierungsproblem.
Ohne Klassifizierung keine Hierachiebildung also keine Normalisierung möglich also keine Ordnung[tm]
Und dachte ich an einen Urlaubsflug mit einer Freundin.
Wir standen wir in Nordafrika beim Zoll oder Passkontrolle oder so...
Der Beamte schaute meine Freundin an und sagte in gebrochenem Englisch "Brille abnehmen", schaute ihr in die Augen und bekam Panik. Sie hat nämlich ein bleues und ein braunes Auge. Sowas ist sehr selten, aber kommt vor.
In vielen Pässen steht die Augenfarbe drin, ob im Deutschen, weiß ich gar nicht - bis heute nicht.
Aber der Mann schien da ein Problem zu sehen, weil etwas vorkam, was seiner Meinung nach nicht vorgesehen war. Wir haben dann ungefähr eine Stunde Tee getrunken mit seinem Kollegen und ihm und dann durften wir gehen.
Das werde ich nie vergessen.
Dein System sollte also offen bleiben.
Eine Orgel hat Eigenschaften.
Das können Baugruppen sein oder deren Bauformen
Die haben wieder Eigenschaften oder Baugruppen...
Das lässt sich auflösen in Alternativen und Optionen
Das einzige, worauf Du da achten musst ist, dass keine zyklischen Verläufe entstehen.
Wenn also die Baugruppe 001.002.01.Az.13 eine enthält, die nachher wieder die 001.002.01.Az.13 enthält, dann kannst Du nach Hause gehen. Dein System wird sich aufhängen ;-))
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom