HTML-formulär, 70+ fält, hantering?

Permalänk
Medlem

HTML-formulär, 70+ fält, hantering?

Jag behöver råd om hur jag ska gå tillväga med ett formulär jag ska digitalisera från ett pappersoriginal.
Formuläret ser ut såhär (http://www.puppe.se/bilder/webform.png)
Det är redan digitaliserat i form av ett HTML-formulär med lite tillhörande CSS. Men jag har kluvna tankar kring hur jag ska lagra informationen. Att spara ner allt i en databas kommer ge ofantliga mängder oanvänt utrymme - alla fält kommer extremt sällan vara ifyllda (de streckade linjerna är bl.a. de fält som ev fylls i). Att få det hela ner i en normaliserad databas med många tabeller blir nog lite svårhanterligt(?)
Så jag har spanat och börjat lite försiktigt att baka ner det hela i XML-format. Jag tänkte spara några fält i databasens kolumner medans den största delen sparas som XML.

Det som formuläret spottar ut än så länge ser ut såhär (ha överseende med den tveksamma namngivningen):
Kundnamn/nr och order.nr etc kommer sparas i databasen separat, för att slippa parsa XML vid en selektion. Notera även att alla fält inte syns här - tomma fält kommer inte tas med i XML-koden, tomma taggar tar onödig plats (bra/dåligt?). De tomma som syns kommer tas bort.

<?xml version="1.0" encoding="utf-8"?> <Ordertask> <Issue> <IssueAmount>5000</IssueAmount> <IssueType>styck</IssueType> <IssueUnitAmount>1</IssueUnitAmount> <IssueTotal>5000</IssueTotal> </Issue> <Resources> <Resource> <Comment/> <Type/> <Weight/> <Color/> <Ink/> <NrOfColors/> </Resource> </Resources> <Options> <Option> <Type/> <Value/> </Option> </Options> <Comments/> </Ordertask>

Gör jag det svårt för mig genom att göra så här? Bör jag ändå designa en databas för detta och skippa XML helt?
Bör jag titta åt ett helt annat håll?

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Medlem

Kan du inte skriva ut allt i en CSV fil och sedan ha en PHP fil som skriver ut allt i Tabels för att sen använda CTRL + F?

Alternativt är att spara det till en excel fil som du kan läsa
http://forums.digitalpoint.com/showthread.php?t=60681

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem
Skrivet av 19KeVVa93:

Kan du inte skriva ut allt i en CSV fil och sedan ha en PHP fil som skriver ut allt i Tabels för att sen använda CTRL + F?

Alternativt är att spara det till en excel fil som du kan läsa
http://forums.digitalpoint.com/showthread.php?t=60681

Jag vill inte skapa en massa filer, då det kommer bli ganska många filer i så fall. Det ska sparas i en databas (MySQL), men jag vill veta om jag ska följa min magkänsla här eller om det är någon annan teknik som skulle fungera smidigare.
T.ex. ska jag i en tabell spara ett ordernummer, med tillhörande beställningsunmmer och ev någon/några fler värden. En kolumn ska vara en "foreign key" till en annan tabell där jag sparar ner ett id och XML datan.
Jag tänker att XML-formatet är tacksamt eftersom det annars kan bli många null i databasen som är helt meningslösa.

Hela formuläret skulle ju kunna ses som ett objekt i t.ex Java. Med all data som andra objektreferenser eller instansvariabler.. men hur för jag över denna tanke till formuläret och databaser på bästa sätt..?

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Medlem

Varför inte köra allt i samma databas. Personligen så skulle jag bara låta de tomma fälten få stå tomma. Det är inget så påverkar prestandan. Så länge du söker i enbart ett fält

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem
Skrivet av 19KeVVa93:

Varför inte köra allt i samma databas. Personligen så skulle jag bara låta de tomma fälten få stå tomma. Det är inget så påverkar prestandan. Så länge du söker i enbart ett fält

Om du har en tabell med t.ex 80 kolumner, varav kanske 60 är tomma.. vid 10 000 rader så har du alltså 800 000 celler i tabellen (helt icke-normaliserad databas), varav 75%, eller 600 000 celler är tomma.. jag har en känsla av att det där inte är helt gratis utrymme?

Kan jag då istället använda t.ex 8 kolumner istället, där en kolumn innehåller XML data, så känns det som en vinst i jämförelse.. men jag bara funderar än.

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Skrivet av Schrimp:

Om du har en tabell med t.ex 80 kolumner, varav kanske 60 är tomma.. vid 10 000 rader så har du alltså 800 000 celler i tabellen (helt icke-normaliserad databas), varav 75%, eller 600 000 celler är tomma.. jag har en känsla av att det där inte är helt gratis utrymme?

Kan jag då istället använda t.ex 8 kolumner istället, där en kolumn innehåller XML data, så känns det som en vinst i jämförelse.. men jag bara funderar än.

Har du läst nått om de olika fälten du kan använda i MySQL och hur dem lagrar sin data på disken?
Om du inte gjort det så bör du göra det.

Permalänk
Medlem
Skrivet av Lullebulle:

Har du läst nått om de olika fälten du kan använda i MySQL och hur dem lagrar sin data på disken?
Om du inte gjort det så bör du göra det.

Jag läste precis att InnoDB använder ett kompakt format som tydligen inte kräver utrymme för NULLS. Var det något sådant du syftade på?
MEDIUMINT tar tydligen 25% mindre utrymme än INT (http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html#int...)

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Medlem

Det verkar ju fruktansvärt onödigt att ha en kolumn för varje fält om du redan innan vet 75% ändå inte kommer att fyllas i, jag skulle nog kika vidare på att peta in hela XML-dokumentet i en long text och bara spara det viktigaste i egna kolumner. Det är ju inget problem att bara läsa ut önskade delar av det som är sparat eftersom det dessutom redan är taggat...

Visa signatur

Stabilitet är överskattat... En krasch om dan gör kroppen glad!

Permalänk
Medlem
Skrivet av RaWeN:

Det verkar ju fruktansvärt onödigt att ha en kolumn för varje fält om du redan innan vet 75% ändå inte kommer att fyllas i, jag skulle nog kika vidare på att peta in hela XML-dokumentet i en long text och bara spara det viktigaste i egna kolumner. Det är ju inget problem att bara läsa ut önskade delar av det som är sparat eftersom det dessutom redan är taggat...

Precis som jag tänkt!
Jag ser det fortfarande som det bästa alternativet..

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Medlem

Jag misstänker att XML-taggarna kommer orsaka mer overhead än att spara NULL i massor av kolumner. Gör ett snabbt test så får du svar på det. Skapa en tabell med 100 000 rader och 80 kolumner, och gör motsvarande för XML-strukturen. Gämför storlekarna på tabellerna.

Jag skulle analysera, gruppera och normalisera formuläret och göra en proper databasdesign. Bara för att formuläret känns som "70 fält" behöver inte databasdesignen bli så.
Jag ser tydliga objekt: Kund, Order, Orderrader, Produkt etc. Låt dessa objekt bli tabeller så har du en databas som är mycket lätt att hantera på alla sätt och vis.

Edit:
Provade göra den "dåliga" designen med 80 columner, alla varchar(50). Genererade 110 000 rader med 10 fält ifyllda med lite slumpmässigt skräp och resten av kolumnerna fick vara NULL.
Gjorde detta på SQL Server, men jag gissar att innodb lagrar information ungefär på samma sätt.

Mitt resultat, 110 000 rader 80 kolumner:
10.6 MB

Det jag vill säga med detta experiment är att utrymme inte är ditt problem. Om du gör en bra struktur så kommer det löna sig i längden. Det blir lättare att göra komplicerade sökningar, lättare att lägga till och ta bort information, lättare att ändra strukturen, lättare att ha konsistent data och så mycket mer!
Om du vill göra det lätt för dig genom att spara "dokument" i en databas, välj då en databas som är anpassad för det, exempelvis CouchDB eller liknande.

Permalänk
Medlem
Skrivet av MrMygel:

Jag misstänker att XML-taggarna kommer orsaka mer overhead än att spara NULL i massor av kolumner. Gör ett snabbt test så får du svar på det. Skapa en tabell med 100 000 rader och 80 kolumner, och gör motsvarande för XML-strukturen. Gämför storlekarna på tabellerna.

Jag skulle analysera, gruppera och normalisera formuläret och göra en proper databasdesign. Bara för att formuläret känns som "70 fält" behöver inte databasdesignen bli så.
Jag ser tydliga objekt: Kund, Order, Orderrader, Produkt etc. Låt dessa objekt bli tabeller så har du en databas som är mycket lätt att hantera på alla sätt och vis.

Edit:
Provade göra den "dåliga" designen med 80 columner, alla varchar(50). Genererade 110 000 rader med 10 fält ifyllda med lite slumpmässigt skräp och resten av kolumnerna fick vara NULL.
Gjorde detta på SQL Server, men jag gissar att innodb lagrar information ungefär på samma sätt.

Mitt resultat, 110 000 rader 80 kolumner:
10.6 MB

Det jag vill säga med detta experiment är att utrymme inte är ditt problem. Om du gör en bra struktur så kommer det löna sig i längden. Det blir lättare att göra komplicerade sökningar, lättare att lägga till och ta bort information, lättare att ändra strukturen, lättare att ha konsistent data och så mycket mer!
Om du vill göra det lätt för dig genom att spara "dokument" i en databas, välj då en databas som är anpassad för det, exempelvis CouchDB eller liknande.

Stort tack för att du, och givetvis ni andra, tagit er tid att svara. Ska skissa vidare på det du sagt här så tror jag att jag kan lösa det smidigt. Det var inte nödvändigt med XML, så bra att få andra vinklar på det!

Visa signatur

WS: Asus P8Z77-I Deluxe mITX | Intel 3770K@4.6 | NH-U12P | Asus 780 GTX | Corsair 2x8GB 1600Mhz CL9 | Samsung 840 512GB | Ubuntu 16.04.3 x86_64 | Corsair AX750 | 2x Dell U2412M | Puppe.se | NAS: i7 860, 16GB DDR3, GA-P55M-UD4, FD Define R3, 8x2TB Samsung F4EG, Serveraid M1015, EVGA 750W G2 PSU, FreeBSD x64

Permalänk
Medlem

Gjorde lite test på vilka sätt som är snabbaste sättet att hämta sparad information från (tror det är ungefär samma att spara och storleken på disken, däremot verkar MySQL vara speciellt hårddiskkrävande (ca fyra gånger mer än JSON/Serialize(), medan två gånger så mycket som XML)).
Testet är gjort så att 2-1000 arrays (ca 10 tecken lång key samt 32 tecken långt value) sparas på respektive sätt, sen kollar jag hur lång tid det tar att ladda på respektive sätt.

Provade med MySQL, XML, JSON och Serialize(). Använder APC, samt så är databasen lokal (ännu sämre prestanda om den inte är det).

Du kan själv testa här:
http://jacce.dyndns.org/benchmarks/data/?result (du kan lista olika många values, genom att lägga till exempelvis &v=100-250 i URL:n).

EDIT: Enda anledningen jag skulle använda MySQL är om det är riktigt känslig data (som lösenord, annars räcker det nog med deny access i .htaccess), eller om du har ett fält med massa olika kolumner men du behöver bara hämta några få kolumner.
Kanske inte det bästa testet, men ger en fingervisning vilket sätt som är bäst att spara på. Rekommenderar JSON för mindre tabeller eller om du behöver kompatibilitet med andra språk, annars den PHP-specifika funktionen Serialize().