• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Dropdown in DB-Abrage durch Checkbox ergänzen

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
Hallo zusammen,

ich bin gerade dabei diese Anleitung hier umzusetzen:
https://werner-zenk.de/mysql/auswahlliste_als_filter_in_einer_db-tabelle_einsetzen.php


Soweit hat auch alles geklappt. Ich möchte nun ein weiteres Dropdown hinzufügen, bei dem ich per Multiple-Choice (also nicht Radio-Button, sondern Checkbox) mehrere Elemente auswählen kann, dass es also quasi so aussieht:
]
viewer.php



In der Datenbank müsste ich diese Werte dann ja auch hinterlegen. Es handelt sich hierbei Zahlen von 001 bis 999; ist es sinnvoll das als Art Array in MySQL zu speichern? Irgendwie wird das ja nicht so richtig unterstützt, in PostgreSQL ging das einfacher.

PHP ist leider nicht meine Stärke; wie gehe ich das denn am besten an/ist das überhaupt möglich?


LG
HanZ
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.560
Ich würde dir mal etwas einwerfen, was in der Lagerverwaltung genutzt wird. Vielleicht kannst du es dir etwas erweitern und darauf aufbauen.

Ein kurzes Demo-Video:
https://www.picflash.org/picture.php?key=1OL20K&action=show

Der Quelltext ist in der ZIP beigefügt und enthält HTML Boilerplate, CSS (minimal aus Bootstrap "geliehen") und Custom Javascript Code.

Was das JS macht, es wandelt jedes Select-Element in eine Custom Dropdown um. Im Dropdown (einmal ein Input) kann nach Feldinhalten gefiltert werden, hier geht es nach [kw]<option value="SuchbarerWert">Text</option>[/kw] und es gibt auch die Möglichkeit einzelne und multiple Auswahlmöglichkeiten zu haben. Im Video sieht man das nicht, das hatte ich vorher aufgenommen. In der HTML ist aber ein Beispiel für beide Fälle.
 

Anhänge

  • dropdown.zip
    3,8 KB · Aufrufe: 522
Zuletzt bearbeitet:

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #3
Danke, damit müsste ja schonmal die HTML-Komponente abgedeckt sein. Bleibt die Frage, wie ich das am besten in PHP/MySQL abdecke, da habe ich nämlich die meisten Probleme mit. MySQL erlaubt ja nicht direkt Arrays. Im Dropdown sollen im Endeffekt um die Tausend Einträge sein, Zahlen von 001 bis 999.
Dann soll in der DB nachgeguckt werden, welche Einträge ebenfalls eine der ausgewählten Zahlen aufweist und dann zurückgegeben werden. Daher würde ich natürlich ungern 1000 Columns in der DB erstellen, sondern das über ein Array gelöst werden.

Ideen, wie ich das am besten angehe?

LG
HanZ
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
Db Normalisierung :)

So wie sich das anhört kann ein Eintrag mehrere Nummern besitzen und jede Nummer kann bei mehreren Einträgen hinterlegt sein? Dann haben wir eine klassische m:n Beziehung (2 Variablen, es ist also nicht bekannt wie viele Verknüpfungen existieren)

Das erfordert (im Normalfall, gibt Ausnahmen wie klassisch bei logs, Rechnungen und ähnlichem das nach dem Schreiben zwingend unveränderlich sein muss) eine Verknüpfungstabelle.

3 Tabellen:

Tabelle deine hauptdaten
id, dein Datensatz, noch ein Wert, bla

Tabelle deine Nummern:
ID, Nummer

Tabelle Datensatz_zu_Nummer
Datensatzid, Nummerid


Für jede gewählte Nummer in einem Datensatz wird ein Eintrag in "Tabelle_zu_Nummer" erstellt.

Das kannst du dann frei verwenden und auswerten Herr nachdem was du damit machen willst.
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #5
Genau, also es sind im Endeffekt Mehrausstattungscodes von Autos; jedes Auto kann mehrere dieser Ausstattungen aufweisen und natürlich bei jedem Auto in jeder Kombination.

Warum muss denn da jetzt eine Verknüpfungstabelle her? Die macht doch hier keinen Mehrwert. Meine Idealvorstellung wäre gewesen:

Spalte "Mehrausstattungen"

Darin dann als Array: [124, 254, 459, 855]

Dann Abfrage: Ist die Auswahl auf der Webseite in dem Array vorhanden? Ja-> Gib True/die Zeile zurück. Nein->Ignoriere diesen Eintrag/Zeile.

Die Verknüpfungstabelle hat doch hier jetzt keinen Vorteil der Speicherung oder? Da muss ich mir ja immer noch Gedanken machen, ob und wie ich das als Array in MySQL reinbekomme.

Oder habe ich was falsch verstanden?

LG
HanZ
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Ist das für dich privat oder wofür ist das? Weil ans Internet solltest du solche Experimente nicht hängen.
 

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
896
Ich bin so frei und werfe mal einen Link ein:
https://www.datenbanken-verstehen.de/datenmodellierung/normalisierung/

Wenn Du später mit den Array-Daten arbeiten willst (also über DB-Abfragen suchen, wer den goldenen Aschenbecher hat), würde ich den Weg der Normalisierung gehen und versuchen die 3. Normalform einzuhalten.

Technisch kannst Du natürlich auch Dein Array serialisieren oder als json in einem Textfeld der Datenbank speichern.
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
Es gibt viele Gründe die für die Normalisierung (wie vorher schon erwähnt 3. Normalform reicht aus) sprechen.

Bzw. was spricht für ein Array in einer Spalte?

- Du möchtest zum Ausstattungsmerkmal ja evtl. auch Informationen Pflegen (Wie Name, Beschreibung, Bild) Dann solltest du eine Tabelle Austattungsmerkmale haben, wenn du nun einen Datensatz aufrufst und auch alle Informationen der Austattung mit ausgeben möchtest - musst du sonst erst den Datensatz mit Array auslesen und damit dann die zusätzlichen Infos in einem 2. Datensatz auslesen - mit der Verknüpfungstabelle geht das in einer Abfrage inkl. optimierungen über das DBMS über Indize, Caches etc.

- Wenn du auswerten möchtest was wie oft verbaut wurde geht das über eine einfache Abfrage (Und sag jetzt nicht, das brauchst du aktuell nicht. Wenn die Datensätze einmal geschrieben sind lässt sich der Inhalt hinterher wenn in einem Jahr die Anforderung dafür kommt nur sehr schlecht umbauen).

- Wenn eine Zusatznummer durch eine andere Ersetzt werden muss geht das ganz simpel über ein einziges update-statement ohne "Suchen und ersetzen" in einem String - was deutlich effizienter ist.

... wenn man das Projekt genau kennt fallen einem sicher noch mehr Ideen ein.

Aber warum hast du dann noch immer das Problem die Information zu speichern?
Du erstellst über eine Foreach-Schleife über das Array mit der ausgewählten Sonderausstatung je ausgewähltem Objekt ein INSERT-Statement mit der ID des Datensatzes und dem gerade verarbeiteten Objekt und führst es aus.

Ja das sind einige Inserts mehr - aber im Normalfall werden die Informationen deutlich öfter gelesen als geschrieben - wodurch man eher das lesen als das schreiben optimiert.

Zusätzlicher Sinn der Normalform ist die Aufteilung von Informationen um Redundanzen und damit oft ein Grund für Fehlerquellen oder Falschinformationen zu reduzieren (z.B. da sich irgend etwas ändert und man nicht an alle Stellen mit dieser Information gedacht hat).
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #9
@BurnerR: Wäre schon fürs Internet. Wieso würdest du das nicht machen?

@braegler: Ich verstehe es nicht ganz. In meinem Beispiel ist doch kein Schlüssel transistiv von einem anderen abhängig oder?

@drfuture: Die Ausstattungsmerkmale sollen rein über die Nummer angegeben werden; eine Beschreibung zu den Nummern findet sich woanders.

"Du möchtest zum Ausstattungsmerkmal ja evtl. auch Informationen Pflegen"

Aktuell sind dieses Spalten geplant:
-> id, Modelljahr, Bestellcode, Karosserie, Fahrwerk, LhdRhd, Motorkennbuchstabe, Getriebekennbuchstabe, Getriebekennbuchstabe_Vorne, Farbcode, Farbbestellcode, Polster, Beschreibung, Auslieferungsdatum, Produktionsdatum


"Wenn du auswerten möchtest was wie oft verbaut wurde geht das über eine einfache Abfrage"
-> Das ist genau der Ziel meiner Datenbank. Ich möchte anzeigen, wie viele Linkslenker mit Motorkennbuchstabe XYZ und Mehrausstattung 123, 456 und 789 gebaut wurden.

"Wenn eine Zusatznummer durch eine andere Ersetzt werden muss"
-> Was meinst du hier mit Zusatznummer?

"... wenn man das Projekt genau kennt fallen einem sicher noch mehr Ideen ein."
-> Ich habe dir die erste Demo mal per PN geschickt.

"Aber warum hast du dann noch immer das Problem die Information zu speichern?"
-> Ich bin mir nicht ganz sicher ob ich die Frage richtig interpretiere: MySQL bietet ja kein Array als Datenstruktur an, man muss es in jedem Fall durch serialize abspeichern oder?

Danke soweit schonmal für die Hilfe!

LG
HanZ
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
Bei der Frage mit dem Array:
Du hattest geschrieben das dein Problem mit dem Array bleibt. Und ich wollte mit der Frage wissen warum. Dein Array wird ja aufgelöst.
Nein es gibt keinen Datentyp Array, da man das so eben meist nicht speichert.
Daher ja meine Frage warum du daran festhalten willst, vor allem da du ja wie du sagtest genau diese Werte auswerten möchtest.

Mit dem Wechsel der Zusatznummer war nur ein Beispiel.
Wenn die Klimaanlage den Wert 99 hat und dann später durch eine baugleiche ersetzt wird und dann den Wert 9964 hat lässt sich die Zuordnung dann leicht tauschen. Ist z.b. interessant wenn man alte Elemente wegen Nachweispflicht im Bestand hält aber für heute eingeben oder auch den gesamten aktiven Bestand neue Elemente einführt.

Bei deiner Tabelle oben kommen um Grunde noch mehr Tabellen raus...

Farbe (ID, farbcode, Farbenstellcode, evtl RGB/hexwert um ein farbbeispiel in der Oberfläche anzuzeigen)

Ebenso bei Karosserie, Fahrwerk etc eine extra Tabelle in der die Werte gepflegt werden damit diese nicht fest im sourcecode der Anwendung stehen und einfach gepflegt und erweitert werden können.

2 Fragen
Warum ist das Baujahr ein Buchstabe?
Warum die Beschreibung der Merkmale an anderer Stelle speichern? Wo du es ausgibst ist ja am Ende egal aber wenn ein Merkmal hinzu kommt oder gelöscht wird musst du sonst an zwei Orten die Liste dafür pflegen > fehleranfällig.
Zusätzlich kann, wenn vorhanden, im dropdown eine Kurzbeschreibung zur Nummer angegeben werden was das ganze einfacher zu bedienen macht.
 
Zuletzt bearbeitet:

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #11
okay, dann habe ich aber noch nicht ganz genau verstanden, wie die mehrausstattungen gespeichert werden. wird dann in der haupttabelle lediglich mit einer ID auf die mehrausstattungstabelle verwiesen und in dieser tabelle ist dann einmal die id als PRIMARY und dann eine gewisse anzahl an spalten, die die mehrausstattungen abdecken?

sprich:

Haupttabelle

id, Modelljahr, Mehrausstattungen
1, 1990, 23

Mehrausstattungstabelle:
id, Mehrausstattung1, Mehrausstattung2, Mehrausstattung3, ...
23, 021, 156, 845, 889, ...

"Warum ist das Baujahr ein Buchstabe?"
Es ist nicht das Baujahr, sondern das Modelljahr. Das Modelljahr fängt bei VW immer im August an, sprich Modelljahr 1992 geht von August 1991 bis Juli 1992.
https://www.nininet.de/fahrgestellnummer.html

Vermutlich damit man bei der Aussage "Modelljahr 1992" nicht automatisch denkt "Januar 1992 bis Dezember 1992". (VW hat dann aber in den Reparaturleitfäden und an anderen Stellen dann doch "Modelljahr 1992" usw geschrieben, von daher weiß ich nicht ob diese Vermutung korrekt ist.
 

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
896
Ich verstehe es nicht ganz. In meinem Beispiel ist doch kein Schlüssel transistiv von einem anderen abhängig oder?
Solange Du wirklich nur die puren Nummern abspeichern willst [123,456,789] hast Du damit recht.
Sobald Du jedoch die einzelnen Ausstattungsmerkmale "verknüpfst", erzeugst Du eine pseudo-Abhängigkeit zwischen 123, 456 und 789.
Alle 3 sind potentielle Schlüssel bei einer Abfrage (welche Autos haben Merkmal 456).


Mehrausstattungstabelle:
id, Mehrausstattung1, Mehrausstattung2, Mehrausstattung3, ...
23, 021, 156, 845, 889, ...

Und genau da hilft Dir eine normalisierte Datenbank Struktur.
Die Mehrausstattungstabelle sollte eigentlich so aussehen
id, haupttabellen_id , mehrausstattungs_ID
1 , 1, 23
2, 1, 021
3, 1, 156
4, 1, 845
5, 1, 889
...
Dann hast Du natürlich noch eine
Tabelle "Mehrausstattungsitem"
id, Mehrausstattung
1, Dildohalter
2, Beheizbarer Aschenbecher
...
156 , Zentraler Wäscheabwurfschacht (Goldwing)
Damit umschiffst Du mehrere Probleme:
1) Deine Struktur enthält keine leeren Felder (leere Felder sind bäääh, nein, nicht immer, aber wirklich wirklich fast immer).
2) Deine Struktur ist flexibel. Wenn morgen ein Maybach mit allen Extras eingebucht werden soll musst Du nicht noch Mehrausstattung11 bis Mehrausstattung10176 als Feld anlegen

Schau Dir mal ein paar der Modelle die hier vorgestellt werden an: http://www.databaseanswers.org/data_models/

Willst Du mehrere Hersteller abdecken und die original Ausstattungs-IDs verwenden, wird es "geringfügig" umfangreicher.

Dazu erstmal eine Tabelle
Hersteller
id, Herstellername
1, Audi
2, Lada
3, Vauxhall
4, Honda
5, Maybach
anlegen und die Tabelle "Mehrausstattungsitem" entsprechend anpassen
id, Hersteller_id, MehrausstattungsHerstellerOwnID, Mehrausstattung (Primary key über Hersteller_id und MehrausstattungsHerstellerOwnID)
1,3,1, Dildohalter (*1)
2,3,2, Beheizbarer Aschenbecher (*2)
...
1723,5,911, Dead Hooker composter (*3)
*1 = der wunderbare Vauxhall Dildohalter mit der OEM Artikelnummer 1
*2 = Vauxhalls beheizbarer Aschenbecher mit OEM no 2
*3 = um das Luxusproblem toter Prostituierten elegant im Maybach zu lösen, jetzt mit der Bestellnummer 911
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #13
Hey braegler,

danke, das hat mir schonmal weitergeholfen. Wenn ich das jetzt richtig verstehe, müsste damit aus dieser Tabelle:



ja damit folgendes werden, oder?



Damit müsste es doch in der 3. NF sein?

Da alles von VW ist, braucht es keine Hersteller, es geht im Endeffekt auch nur um ein Modell.

Beste Grüße
HanZ
 

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
896
Jupp, von der Struktur her passt das (für die Ausstattung).
Als Überlegungs-Ansatz kannst Du folgendes verwenden:

Wird in Deiner Datenflut ein Wert wiederholt (Cabrio, Grün, Automatik, Whatever) ist es ratsam zu Überlegen ob es Sinn macht, die entsprechenden Wert in einer x:n Beziehung zu speichern.

Gibt es in Deinem Tabellendesign Felder die leer sind? Wenn es keine gute Begründung dafür gibt (z.B. Felder die mit der Zeit gefüllt werden UND in einer 1:1 Beziehung zum Datensatz stehen) ist das ein gutes Indiz, dass die Daten in eine eigene Tabelle gehören.
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #15
@braegler: Das habe ich jetzt wiederum nicht verstanden. Ich weiß auch gar nicht, ob das alles zu Overkill ist; laut Kraftfahrtbundesamt sind aktuell noch 1500 Autos zugelassen, etwas mehr werden es schon sein, da Ausland und genullte Typschlüsselnummer da nicht mit reinspielen.

Gibt es in Deinem Tabellendesign Felder die leer sind?
Ja, sehr häufig! Schlichtweg weil alles was wir eintragen nur aufgrund von belastbaren Dokumenten (Bestätigungen von VW z.B.) übernehmen und häufig sind da nicht alle Daten eingetragen.

Daher habe ich jetzt auch nicht ganz verstanden, warum hier Cabrio oder Grün nochmals in einer x:n-Beziehung (was ist hier x, was n?) gespeichert werden soll.
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
Die id Spalte der Zuordnungstabelle kannst du dir noch sparen. Nummer wird ein Index über den primary Key gebaut (wenn nicht anders angegeben) und du selektierst ja anhand der id des Eintrags, die laufende id würde vermutlich nie verwendet werden. Die id wird nur dann extra erzeugt wenn anhand der anderen Gegebenheiten nicht sicher ist das es keine Dubletten gibt.
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #17
@drfuture: dann kann ich ja aber doch keine daten mehr löschen/editieren aus der zuordnungstabelle oder?
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
doch klar - die Zeile Hauttabelle_id + Ausstattung_ID in kombindation darf es ja nach wie vor nur 1x geben.

Du sagst halt dann update Mehrausstattungen set Austattung_ID = 123 where Haupttablle_ID = 123 and Ausstattungs_ID = 559
Wenn du über die ID lieber selektierst kannst du diese natürlich schon lassen - dann hat sie ja für dich einen Zweck :)
 

HanZ

Aktiver NGBler

Registriert
16 Juli 2013
Beiträge
1.057
  • Thread Starter Thread Starter
  • #19
Bei mir sieht das so aus, da kann ich nichts bearbeiten/löschen. Wo liegt da mein Fehler?




/edit: Also per SQL-Query geht es, in phpMyAdmin nicht. Ich schlussfolgere daraus, dass du mir extra den SQL-Query gegeben hast, dass es eben nur über diesen geht und nicht auch über die Weboverfläche?
 
Zuletzt bearbeitet:

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.728
Ort
in der Zukunft
Das du phpmyadmin verwendest (nein im Prinzip ist der für vieles praktisch, SQL als Sprache ist aber deutlich flexibler)

Ich weiß nicht ob phpmyadmin dann damit zurecht kommt aber du kannst mit
[src=mysql]
ALTER TABLE mehrausstattung
ADD CONSTRAINT Ausstattung_pk
PRIMARY KEY (haupttabelle_id, mehrausstattung_id);
[/src]
V
 
Oben