Het gebruik van look-up tables in databases (RDB design)

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • S.O.
  • Registratie: Januari 2012
  • Laatst online: 25-01-2021
Hoi iedereen,

Ik ben bezig om een ERD diagram te maken voor een database voor een toekomstige Multilanguage evenementen website.
Deze website gaat een login systeem krijgen met daarbij behorende gebruiker / account gegevens.

Ik zat zo te denken om bijvoorbeeld een tabel te maken met daarin alle tijdzones.
Dit tabel kan ik dan gebruiken om een pulldown lijst te generen op de website en linken als foreign key in databases als informatie van de gebruiker.

Ook zou ik dan een aparte landenlijst willen maken zodat gebruikers uit deze lijst kunnen selecteren en dit ook als foreign key willen gebruiken in de tabel van de gebruiker.

Is dit aan te raden?
Zeker als de database (veel) groter gaat worden?
Is het gebruik van look-up tables om duplicering van data te voorkomen aan te bevelen?

De volgende websites heb ik gelezen en kan eigenlijk niet echt tot een duidelijke conclusie komen met mijn (beperkte) kennis:

https://dba.stackexchange...s-in-relational-databases
http://www.sqlservercentr.../lookuptablemadness/1464/
https://www.red-gate.com/...-errors-you-should-avoid/
https://www.apress.com/us...le-lookup-tables/13323426


Groet S.O.

Beste antwoord (via S.O. op 21-01-2019 20:22)


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dit is effectief werken in de "derde normaalvorm" (3NF) en dat wordt normaal gesproken aanbevolen bij relationele databases, de "lagere" vormen zorgen voor veel data-duplicatie (maar zijn soms nuttig ivm performance of eenvoud) en de "hogere" vormen zijn vooral erg puristisch en daarmee moeilijk om mee te werken.

Vertalingen in de database is weer een wat ingewikkelder ding, omdat je zeker met de concrete voorbeelden zou kunnen beargumenteren dat dat iets van de weergave-laag is (en je met localization-files zou moet werken) of zelfs standaard in je programmeertaal zou kunnen zitten.

Daarom geldt er zoals altijd een 'het hangt er vanaf'-voorbehoud. Het is voor (min of meer) vaste datasets ook een beetje zonde om steeds een query in je database te moeten doen. Maar anderzijds als je bij je query direct de van zo'n aspect van je data de juiste aanvullende gegevens kan mee-joinen, dan scheelt het daar weer wat aan vertaalslagen.

Specifiek voor tijdzones bieden programmeertalen (en databases) erg veel functionaliteit, dus dat zou je dan gaan lopen dupliceren. In theorie heb je uiteindelijk alleen de offset nodig als integer (in minuten dan), maar er is natuurlijk wat gedoe met zomer/wintertijd. Waardoor e.o.a. identifier handiger is, de standaardidentifier (een tekstje) is dan weer erg lang...

Nog erger is dat de tijdzones min of meer willekeurig en heel ad-hoc (kunnen) veranderen - zoals Marokko dat een paar dagen voor de overgang besloot te stoppen met wintertijd - waardoor het extra nuttig is om zo min mogelijk daarvoor zelf te doen. De beschikbare zones veranderen iets minder snel, maar ook dat komt voor.

Voor andere "keuzelijstjes" zijn er ook allerlei afwegingen mogelijk.

Omdat wij relatief veel van de presentatie van data in de code-laag doen voegen wij daarom aan "enums" in de code vaak een id toe. We hebben ook generieke code om automatisch a.d.h.v. zo'n id dan de juiste enum-waarde op te zoeken. In de database en alle andere communicatie met iets buiten de code, zoals submitten van formulieren, geven we dan domweg dat id door zodat we de "lijst beschikbare enums" maar op 1 plek hoeven te onderhouden en tegelijkertijd ook niet extra queries nodig hebben om ze als keuze-opties te tonen.

Een voorbeeld van een dergelijke enum is de status die een review van onze redactie kan hebben (in productie, wordt nagekeken, klaar voor publicatie, e.a.). Bij dergelijke enums hangt er natuurlijk ook gedrag van de site af van de specifieke waarde, waardoor je sowieso al relatief "alle" kennis daarover moet hebben in je code (of je datamodel complexer moet maken).

Alle reacties


Acties:
  • +2 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Dat is een redelijk gebruikelijke en goede techniek, ja. Lees ook eens wat over databasenormalisatie.

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dit is effectief werken in de "derde normaalvorm" (3NF) en dat wordt normaal gesproken aanbevolen bij relationele databases, de "lagere" vormen zorgen voor veel data-duplicatie (maar zijn soms nuttig ivm performance of eenvoud) en de "hogere" vormen zijn vooral erg puristisch en daarmee moeilijk om mee te werken.

Vertalingen in de database is weer een wat ingewikkelder ding, omdat je zeker met de concrete voorbeelden zou kunnen beargumenteren dat dat iets van de weergave-laag is (en je met localization-files zou moet werken) of zelfs standaard in je programmeertaal zou kunnen zitten.

Daarom geldt er zoals altijd een 'het hangt er vanaf'-voorbehoud. Het is voor (min of meer) vaste datasets ook een beetje zonde om steeds een query in je database te moeten doen. Maar anderzijds als je bij je query direct de van zo'n aspect van je data de juiste aanvullende gegevens kan mee-joinen, dan scheelt het daar weer wat aan vertaalslagen.

Specifiek voor tijdzones bieden programmeertalen (en databases) erg veel functionaliteit, dus dat zou je dan gaan lopen dupliceren. In theorie heb je uiteindelijk alleen de offset nodig als integer (in minuten dan), maar er is natuurlijk wat gedoe met zomer/wintertijd. Waardoor e.o.a. identifier handiger is, de standaardidentifier (een tekstje) is dan weer erg lang...

Nog erger is dat de tijdzones min of meer willekeurig en heel ad-hoc (kunnen) veranderen - zoals Marokko dat een paar dagen voor de overgang besloot te stoppen met wintertijd - waardoor het extra nuttig is om zo min mogelijk daarvoor zelf te doen. De beschikbare zones veranderen iets minder snel, maar ook dat komt voor.

Voor andere "keuzelijstjes" zijn er ook allerlei afwegingen mogelijk.

Omdat wij relatief veel van de presentatie van data in de code-laag doen voegen wij daarom aan "enums" in de code vaak een id toe. We hebben ook generieke code om automatisch a.d.h.v. zo'n id dan de juiste enum-waarde op te zoeken. In de database en alle andere communicatie met iets buiten de code, zoals submitten van formulieren, geven we dan domweg dat id door zodat we de "lijst beschikbare enums" maar op 1 plek hoeven te onderhouden en tegelijkertijd ook niet extra queries nodig hebben om ze als keuze-opties te tonen.

Een voorbeeld van een dergelijke enum is de status die een review van onze redactie kan hebben (in productie, wordt nagekeken, klaar voor publicatie, e.a.). Bij dergelijke enums hangt er natuurlijk ook gedrag van de site af van de specifieke waarde, waardoor je sowieso al relatief "alle" kennis daarover moet hebben in je code (of je datamodel complexer moet maken).

Acties:
  • 0 Henk 'm!

  • mcDavid
  • Registratie: April 2008
  • Laatst online: 23:09
ACM schreef op maandag 21 januari 2019 @ 08:41:

Specifiek voor tijdzones bieden programmeertalen (en databases) erg veel functionaliteit, dus dat zou je dan gaan lopen dupliceren. In theorie heb je uiteindelijk alleen de offset nodig als integer (in minuten dan), maar er is natuurlijk wat gedoe met zomer/wintertijd. Waardoor e.o.a. identifier handiger is, de standaardidentifier (een tekstje) is dan weer erg lang...

Nog erger is dat de tijdzones min of meer willekeurig en heel ad-hoc (kunnen) veranderen - zoals Marokko dat een paar dagen voor de overgang besloot te stoppen met wintertijd - waardoor het extra nuttig is om zo min mogelijk daarvoor zelf te doen. De beschikbare zones veranderen iets minder snel, maar ook dat komt voor.
Dit is inderdaad een belangrijk punt. Als je zelf het onderhoud van de data wilt doen is dit een belangrijk argument om het in een database te doen. Dan kun je immers met een relatief eenvoudige crud interface, iedere aardappel de data laten bijwerken. Als het in een text file zit zul je veelal een code deploy moeten doen, wat vaak minder praktisch is.

Dat gezegd hebbende, voor landen lijsten en tijdzones bestaan ongetwijfeld goed onderhouden libraries (zover die niet al gewoon in je programmeertaal geïntegreerd zitten). Daarmee kun je het onderhoud ervan waarschijnlijk helemaal "uitbesteden". Dan is het handiger gewoon de conventies van zo'n library te gebruiken in plaats van zelf iets te bouwen

Acties:
  • 0 Henk 'm!

  • S.O.
  • Registratie: Januari 2012
  • Laatst online: 25-01-2021
Wouw even lezen wat er allemaal verteld en uitgelegd wordt.
Dat is een redelijk gebruikelijke en goede techniek, ja. Lees ook eens wat over databasenormalisatie.
Ik heb al heel wat uurtjes lopen spitten op het Internet over normalisering. Daarom ik ook eigenlijk geen chocolade van die verhalen kon maken. Dit zette mij aan het twijfelen namelijk.
@Radiant Hartelijk bedankt voor je tijd /antwoord in ieder geval :)
Dit is effectief werken in de "derde normaalvorm" (3NF) en dat wordt normaal gesproken aanbevolen bij relationele databases, de "lagere" vormen zorgen voor veel data-duplicatie (maar zijn soms nuttig ivm performance of eenvoud) en de "hogere" vormen zijn vooral erg puristisch en daarmee moeilijk om mee te werken.
Als iemand die probeert zichzelf iets te leren, zou ik zeggen 3NF zou toch voldoende moeten zijn om een goede basis te leggen voor de database?
Vertalingen in de database is weer een wat ingewikkelder ding, omdat je zeker met de concrete voorbeelden zou kunnen beargumenteren dat dat iets van de weergave-laag is (en je met localization-files zou moet werken) of zelfs standaard in je programmeertaal zou kunnen zitten.

Daarom geldt er zoals altijd een 'het hangt er vanaf'-voorbehoud. Het is voor (min of meer) vaste datasets ook een beetje zonde om steeds een query in je database te moeten doen. Maar anderzijds als je bij je query direct de van zo'n aspect van je data de juiste aanvullende gegevens kan mee-joinen, dan scheelt het daar weer wat aan vertaalslagen.
In versie 1.0 wil ik eerst voor Nederlandse taal gaan als opmaak voor de website. Dit om het nog een beetje behapbaar te houden. Dus teksten en opmaak zitten dus nog niet in een database.
Voor versie 2.0 wil ik graag de teksten in een database hebben zodat het, in mijn gedachte, betrekkelijk minder werk zou kosten om tekst / vertalingen toe te voegen ed.
Dan is het eventueel ook mogelijk om andere mensen via een eenvoudig CMS systeem toegang te geven.
Ze hoeven dan maar minimale kennis hier voor te hebben.
Tevens kunnen ze dan ook de opmaak van de website niet per ongeluk verpieteren.
Voor versie 3.0 Zou ik eventueel de opmaak van de website appart willen hebben zodat ik eventueel andere mensen kan vragen om hierbij te helpen.
Op deze manier zou je uiteindelijk tot iets kunnen komen waarbij verschillende accounts versillende mogelijkheden hebben om dingen aan te passen.
Specifiek voor tijdzones bieden programmeertalen (en databases) erg veel functionaliteit, dus dat zou je dan gaan lopen dupliceren. In theorie heb je uiteindelijk alleen de offset nodig als integer (in minuten dan), maar er is natuurlijk wat gedoe met zomer/wintertijd. Waardoor e.o.a. identifier handiger is, de standaardidentifier (een tekstje) is dan weer erg lang...
Hier ben ik nog over aan het nadenken wat de slimste slag is, hoe dit zou kunnen werken ed.
Wel heb een aantal besluiten op papier gezet, zoals dat alle tijden en tijdzones terug worden gerekend naar 1 standaard tijd (UTC) in de database en de opmaak moet voldoen aan (ISO 8601)
In mijn gedachte zouden we dan alleen nog maar tijdzone correcties en winter/somer offset erbij / eraf moeten rekenen om de juiste gegevens te tonen op de website, algelang waar de persoon in kwestie zich bevindt of hoe hij zijn webbrouwser / OS aan locatie heeft ingesteld.
Wel zit ik nog even af te vragen of ik bijvoorbeeld deze berekening op de SQL server laat doen of in PHP.
Weet nog niet wat de meeste effectieve oplossing is.
Nog erger is dat de tijdzones min of meer willekeurig en heel ad-hoc (kunnen) veranderen - zoals Marokko dat een paar dagen voor de overgang besloot te stoppen met wintertijd - waardoor het extra nuttig is om zo min mogelijk daarvoor zelf te doen. De beschikbare zones veranderen iets minder snel, maar ook dat komt voor.
Zoiets zal altijd een uitdaging zijn.
Omdat wij relatief veel van de presentatie van data in de code-laag doen voegen wij daarom aan "enums" in de code vaak een id toe. We hebben ook generieke code om automatisch a.d.h.v. zo'n id dan de juiste enum-waarde op te zoeken. In de database en alle andere communicatie met iets buiten de code, zoals submitten van formulieren, geven we dan domweg dat id door zodat we de "lijst beschikbare enums" maar op 1 plek hoeven te onderhouden en tegelijkertijd ook niet extra queries nodig hebben om ze als keuze-opties te tonen.

Een voorbeeld van een dergelijke enum is de status die een review van onze redactie kan hebben (in productie, wordt nagekeken, klaar voor publicatie, e.a.). Bij dergelijke enums hangt er natuurlijk ook gedrag van de site af van de specifieke waarde, waardoor je sowieso al relatief "alle" kennis daarover moet hebben in je code (of je datamodel complexer moet maken).
Ik denk dat ik weet wat je ongeveer bedoeld....
Dit is iets waar ik verder even in moet verdiepen als het zover is.

@ACM Bedankt voor je tijd / uitleg en tips :)
mcDavid schreef op maandag 21 januari 2019 @ 09:14:
[...]


Dit is inderdaad een belangrijk punt. Als je zelf het onderhoud van de data wilt doen is dit een belangrijk argument om het in een database te doen. Dan kun je immers met een relatief eenvoudige crud interface, iedere aardappel de data laten bijwerken. Als het in een text file zit zul je veelal een code deploy moeten doen, wat vaak minder praktisch is.

Dat gezegd hebbende, voor landen lijsten en tijdzones bestaan ongetwijfeld goed onderhouden libraries (zover die niet al gewoon in je programmeertaal geïntegreerd zitten). Daarmee kun je het onderhoud ervan waarschijnlijk helemaal "uitbesteden". Dan is het handiger gewoon de conventies van zo'n library te gebruiken in plaats van zelf iets te bouwen
Toen ik een poos geleden begon met deze uitdaging, heb ik een aantal beslissingen genomen waaraan ik me zoveel mogelijk aan wil houden.
Een van die beslissingen was om zo min mogelijk gebruikt te maken van complete liberies ed.
Dus zoveel mogelijk pure PHP, HTML, CSS en SQL code en eventueel JavaScript.

Dit om een aantal redenen die voor mij belangrijk zijn:
Programmeer zo lean mogelijk.
Geen overbodige code die niet gebruikt wordt.
Korte code zonder overhead zou in principe ook minder netwerk data nodig moeten hebben.
Een vlotte website die minimale afhankelijkheden heeft van lyberies.

Dus dat betekend vermoedelijk dat er zelf veel gebouwd enventueel onderhouden moet gaan worden.
Dit is hoe ik erover denk.

Op dit moment heb ik 1 libery op de lijst staan en dat is PHPmailer.

Dit wil niet zeggen dat ik niet in de liberies kijk hoe ze dingen gedaan hebben.
Je kunt daar een massa van leren.

En beter goed overgenomen dan zelf slecht verzonnen...

@mcDavid Bedankt voor je input in ieder geval. Jouw suggestie is natuurlijk wel onderhouds vriendelijker maar maakt een website ook afhankelijker van derden.

@ ALL Bedankt voor jullie tijd en uitleg. Ik vermoed dat ik in de toekomst de hulp van dit forum vaker nodig zal hebben als ik er zelf (nog) niet uit kom.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

S.O. schreef op maandag 21 januari 2019 @ 20:22:
Als iemand die probeert zichzelf iets te leren, zou ik zeggen 3NF zou toch voldoende moeten zijn om een goede basis te leggen voor de database?
Ja 3NF is de aanbevolen werkwijze. En soms is het interessant om omlaag (of omhoog?) af te wijken, maar dat zouden dan uitzonderingen moeten zijn :)
In versie 1.0 wil ik eerst voor Nederlandse taal gaan als opmaak voor de website. Dit om het nog een beetje behapbaar te houden. Dus teksten en opmaak zitten dus nog niet in een database.
Voor een CMS is het inderdaad wel gebruikelijk om teksten en opmaak in een database te hebben. Voor "zinnetjes op de site" komt het vaak uit vertalingsbestanden, maar die grens is vooral bij CMS-en heel verschillend :P
Tevens kunnen ze dan ook de opmaak van de website niet per ongeluk verpieteren.
Er zijn allerlei tools om ze te helpen met invoeren van html (wysiwyg editors) en weer andere tools die html die ze uiteindelijk opsturen nog op te schonen. Het is sowieso aan te raden om zo min mogelijk opmaak erin te hebben en met name de structuur van de tekst vast te leggen in de html (dus werk met css, zo min mogelijk met css-classes in wat je opslaat en bij voorkeur geen inline style).
Wel zit ik nog even af te vragen of ik bijvoorbeeld deze berekening op de SQL server laat doen of in PHP.
Weet nog niet wat de meeste effectieve oplossing is.
Databases hebben vrij uitgebreide ondersteuning voor datums met tijdzones. Dat kan je het beste gewoon gebruiken. Omrekenen naar UTC is dan niet nodig, zolang de database maar weet welke tijdzone bij een ingevoerde datum gold (dus een datum opsturen met gebruikte tijdzone).

Specifiek date en datetime worden opgeslagen met een tijdzone (in het geval van mysql de 'timestamp' niet!). Op die manier kan je zowel in de database als in php die informatie gebruiken om e.e.a. om te rekenen naar de juiste tijdzone.
Zoiets zal altijd een uitdaging zijn.
Eens, maar je kan de pijn beperken of geheel voorkomen door "net genoeg" informatie van tijdzones zelf vast te leggen :)
Een van die beslissingen was om zo min mogelijk gebruikt te maken van complete liberies ed.
Dus zoveel mogelijk pure PHP, HTML, CSS en SQL code en eventueel JavaScript.
Voor met name php zou ik je wel aanbevelen om een paar libraries te gebruiken. Het scheelt bijvoorbeeld erg veel werk om iets als "HTMLPurifier" (of een van de alternatieven) te gebruiken voor het opschonen van de html. En je voorkomt ook alle beginnersfouten daarmee die zij al opgelost hebben (zoals dat je javascript: kan doen in een a's href of nare dingen met inline css)
Een vlotte website die minimale afhankelijkheden heeft van lyberies.
Je doet het vast niet expres fout, maar meestal noemen we die dingen library en als meervoud libraries :)
Dit wil niet zeggen dat ik niet in de liberies kijk hoe ze dingen gedaan hebben.
Je kunt daar een massa van leren.
Wij hadden bij Tweakers ook een sterke "not invented here"-afkeer... Maar uiteindelijk scheelt het je wel erg veel werk als je toch ook serieus libraries overweegt. Maar je leert inderdaad wel veel meer van het zelf ook een keer doen.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:41
S.O. schreef op maandag 21 januari 2019 @ 20:22:
In versie 1.0 wil ik eerst voor Nederlandse taal gaan als opmaak voor de website. Dit om het nog een beetje behapbaar te houden. Dus teksten en opmaak zitten dus nog niet in een database.
Ik raad je wel aan om direct al voorbereid te zijn op meertaligheid, ook al doe je eerst maar 1 taal. Het is een hoop werk om dat later nog aan te passen. Dus al je schermtekstjes uit een I18n lib laten komen, datum/tijd formaten direct goed, getalnotatie direct goed.

(en wat betekent 'opmaak in de database'?)
Hier ben ik nog over aan het nadenken wat de slimste slag is, hoe dit zou kunnen werken ed.
Wel heb een aantal besluiten op papier gezet, zoals dat alle tijden en tijdzones terug worden gerekend naar 1 standaard tijd (UTC) in de database en de opmaak moet voldoen aan (ISO 8601)
Bereid je hier goed op voor. Ik lees dat je evenementen gaat opslaan: overweeg of opslaan in UTC wel zo'n goed idee is.
Een voorbeeld: Een evenement begint op 18 juli 2020 om 14 uur

In database (UTC): 2020-07-18 12:00:00
Terugrekenen (user zit in 'Europe/Amsterdam' dus UTC+2): 2020-07-18 14:00:00

Stel nu dat zomertijd afgeschaft wordt afgeschaft en is 'Europe/Amsterdam' het hele jaar op UTC+1

In database (UTC): 2020-07-18 12:00:00
Terugrekenen (user zit in 'Europe/Amsterdam' maar gewijzigd naar UTC+1): 2020-07-18 13:00:00

Maar de organisator wou beginnen om 14 uur. En mensen die het evenement via jou site vinden zijn er een uur te vroeg.

Dus in dit geval is een datatype dat ook de tijdzone erbij bewaart beter.
In mijn gedachte zouden we dan alleen nog maar tijdzone correcties en winter/somer offset erbij / eraf moeten rekenen om de juiste gegevens te tonen op de website, algelang waar de persoon in kwestie zich bevindt of hoe hij zijn webbrouwser / OS aan locatie heeft ingesteld.
Wel zit ik nog even af te vragen of ik bijvoorbeeld deze berekening op de SQL server laat doen of in PHP.
Weet nog niet wat de meeste effectieve oplossing is.
Handigst is om een educated guess te doen voor de tijdzone en de gebruiker deze te laten wijzigen (bv in een profiel ofzo).
Stel, ik ben Nederlands en zie je evenementen in de Nederlandse tijdzone. Alles prima. Nu ga ik naar New York en bezoek je site daar. Hoe zou ik mijn tijden willen zien? EST? CET? UTC? voor alles wat te zeggen.

Acties:
  • 0 Henk 'm!

  • S.O.
  • Registratie: Januari 2012
  • Laatst online: 25-01-2021
Er zijn allerlei tools om ze te helpen met invoeren van html (wysiwyg editors) en weer andere tools die html die ze uiteindelijk opsturen nog op te schonen. Het is sowieso aan te raden om zo min mogelijk opmaak erin te hebben en met name de structuur van de tekst vast te leggen in de html (dus werk met css, zo min mogelijk met css-classes in wat je opslaat en bij voorkeur geen inline style).
Bedankt voor de tips en info.. Dit ga ik opnemen in mijn besluiten lijst.
Databases hebben vrij uitgebreide ondersteuning voor datums met tijdzones. Dat kan je het beste gewoon gebruiken. Omrekenen naar UTC is dan niet nodig, zolang de database maar weet welke tijdzone bij een ingevoerde datum gold (dus een datum opsturen met gebruikte tijdzone).

Specifiek date en datetime worden opgeslagen met een tijdzone (in het geval van mysql de 'timestamp' niet!). Op die manier kan je zowel in de database als in php die informatie gebruiken om e.e.a. om te rekenen naar de juiste tijdzone.
Ik ga dat eens even uitzoeken wat ik kan vinden hierover in de documentatie van MariaDB.

Maar op dit moment ziet mijn systeem op papier er grof weg zo uit:

Zodra de organisator een evenement aanmaakt, moet er de tijd, datum en locatie ingevoerd worden.
Aan de hand van de locatie gegevens zou het mogelijk moeten zijn of daar de juiste timezone, winter/zomertijd offset bij te bepalen.
Ik verwacht, dat als ik ga zoeken op het internet, dat er al tabellen of liberies bestaan die ons daarbij kunnen helpen.

Dus even grof de functie voor de invoer van een nieuw evenement in de database voor wat betreft tijd:
(Invoer datum/tijd) + (timezone correctie) + (zomer/wintertijd correctie) = UTC
Ongeacht welk evenement op welke locatie, kunnen we steeds dezelfde functie gebruiken.

Wanneer een bezoeker / organisator iets opzoekt, dan hebben we grof weg de volgende functie:
UTC + (timezone correctie) + (zomer/wintertijd correctie) = weergave gegevens in browser

Doordat er geen tijd/datum, tijdzone, offset direct gekoppeld is aan een eventement, maar tijd/datum & locatie zou het bij een wijziging van time/zone of zomer/wintertijd offset alleen het desbetreffende tabel aangepast hoeven te worden.
Anders zou je alle evenementen moeten nalopen of zij wel of geen aanpassingen nodig hebben.

Misschien dat ik met dit systeem compleet de plank mis sla...Laat me het vooral weten.

Wel begrijp ik, dat het maken van de functies die ervoor zorgen dat de juiste time/zone en offset geselecteerd wordt, ook pittige uitdagingen kan geven.
Voor met name php zou ik je wel aanbevelen om een paar libraries te gebruiken. Het scheelt bijvoorbeeld erg veel werk om iets als "HTMLPurifier" (of een van de alternatieven) te gebruiken voor het opschonen van de html. En je voorkomt ook alle beginnersfouten daarmee die zij al opgelost hebben (zoals dat je javascript: kan doen in een a's href of nare dingen met inline css)
Zal ik ook naar gaan kijken. Maar ben me ervan bewust dat ook het CMS gedeelte een pittige santizing nodig voor wat betreft de invoer van de gebruiker. Dit geldt natuurlijk ook voor input vanuit de account gedeelte ed.
Wij hadden bij Tweakers ook een sterke "not invented here"-afkeer... Maar uiteindelijk scheelt het je wel erg veel werk als je toch ook serieus libraries overweegt. Maar je leert inderdaad wel veel meer van het zelf ook een keer doen.
Vooral het leren, opzoeken op internet en zelf bedenken zorgt er voor dat je, in mijn mening, ook echt gaat begrijpen wat je aan het bouwen bent.
Als je relatief vlug resultaat wilt boeken, ja dan zijn liberies geweldige stukken codes.
Ik raad je wel aan om direct al voorbereid te zijn op meertaligheid, ook al doe je eerst maar 1 taal. Het is een hoop werk om dat later nog aan te passen. Dus al je schermtekstjes uit een I18n lib laten komen, datum/tijd formaten direct goed, getalnotatie direct goed.
Bedankt voor de tip. Ik begrijp de achterliggende gedacht van, geen werk verrichten van wat je later weer compleet overnieuw moet doen.
(en wat betekent 'opmaak in de database'?)
Met opmaak bedoek ik eigenlijk dat de opmaak van een website (bijv CSS ed), dus niet de teksten, als gegevens in een database te zetten.
Ik begrijp dat dit wel heel erg ver gaat. Maar zou in de toekomst ervoor kunnen zorgen, dat ander mensen de website gedeeltelijk kunnen aanpassen voor wat betreft de look en feel. Via een soort CMS portal oid.
Handigst is om een educated guess te doen voor de tijdzone en de gebruiker deze te laten wijzigen (bv in een profiel ofzo).
Stel, ik ben Nederlands en zie je evenementen in de Nederlandse tijdzone. Alles prima. Nu ga ik naar New York en bezoek je site daar. Hoe zou ik mijn tijden willen zien? EST? CET? UTC? voor alles wat te zeggen.
Hierover heb ik al zitten nadenken en heb nog niet echt een definitieve technische oplossing bedacht.
Om een goede educated guess te kunnen doen, moet je informatie hebben.
Als iemand een account heeft, zou je de gebruiker kunnen aanbieden om deze instellingen op te slaan en aan te bieden wanneer er ingelogd wordt.
Je zou dan tevens kunnen aanbieden GPS posititie, taal/regio OS instellingen, webbrouwser instellingen te mogen gebruiken hiervoor.
Dit is dan een bewuste keuze van de gebruiker.

Voor mensen die anoniem de website bekijken wordt het een andere uitdaging.
Daar zou je elke keer dus moeten vragen wat ze willen delen aan info om de website goed te laten functioneren als ze de site bezoeken.
Ik zelf heb een hekel aan die cookie meldingen die je eerst moet accepteren of aanpassen om door te kunnen gaan.
Zelf bezoek ik vaak pagina's niet meer waar dit groot irritant in het scherm komt te staan.

Ben dus nog aan het leren /zoeken / bedenken hoe dit zou moeten gaan werken zonder (sessie) cookies ed. voor de anonieme bezoeker
Dan hoef ik ook geen cookie banner op de website te plaasten i.v.m. AVG ed.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:41
S.O. schreef op dinsdag 22 januari 2019 @ 21:55:

Zodra de organisator een evenement aanmaakt, moet er de tijd, datum en locatie ingevoerd worden.
Aan de hand van de locatie gegevens zou het mogelijk moeten zijn of daar de juiste timezone, winter/zomertijd offset bij te bepalen.
Ik verwacht, dat als ik ga zoeken op het internet, dat er al tabellen of liberies bestaan die ons daarbij kunnen helpen.

Dus even grof de functie voor de invoer van een nieuw evenement in de database voor wat betreft tijd:
(Invoer datum/tijd) + (timezone correctie) + (zomer/wintertijd correctie) = UTC
Ongeacht welk evenement op welke locatie, kunnen we steeds dezelfde functie gebruiken.

Wanneer een bezoeker / organisator iets opzoekt, dan hebben we grof weg de volgende functie:
UTC + (timezone correctie) + (zomer/wintertijd correctie) = weergave gegevens in browser

Doordat er geen tijd/datum, tijdzone, offset direct gekoppeld is aan een eventement, maar tijd/datum & locatie zou het bij een wijziging van time/zone of zomer/wintertijd offset alleen het desbetreffende tabel aangepast hoeven te worden.
Anders zou je alle evenementen moeten nalopen of zij wel of geen aanpassingen nodig hebben.

Misschien dat ik met dit systeem compleet de plank mis sla...Laat me het vooral weten.

Wel begrijp ik, dat het maken van de functies die ervoor zorgen dat de juiste time/zone en offset geselecteerd wordt, ook pittige uitdagingen kan geven.
Die functies zijn beschikbaar in elke programmeertaal. Die conversie is het probleem niet maar wel de opslag.

Ik raad je aan om niet zelf timezones te beheren. Als het goed is heeft ofwel je besturingssysteem ofwel je databasesysteem daar voorzieningen voor. En in elk geval die van je besturingssysteem worden bij updates ook meegenomen. PHP gebruikt de definities van je besturingssysteem voor de conversiefuncties

Als je gewoon gebruikt wat PHP aanbiedt aan conversiefuncties, hoef je ook niet bezig te zijn met winter/zomertijd (en heel veel landen gebruiken geen zomer en wintertijd of wijzigen de ingangstijd van zomertijd of wintertijd)

Ik zou dus de begin- en eindtijd van een evenement altijd opslaan als 'tijdstip in tijdzone van locatie van evenement' en de tijdzone erbij, dus voor een evenement in Nederland:
- '2019-07-18 14:00:00'
- 'Europe/Amsterdam'

(overweeg ook het gebruik van PostgreSQL: die kan timestamps met timezone opslaan en de conversie voor je afhandelen)

Acties:
  • 0 Henk 'm!

  • S.O.
  • Registratie: Januari 2012
  • Laatst online: 25-01-2021
rutgerw schreef op woensdag 23 januari 2019 @ 09:12:
[...]


Die functies zijn beschikbaar in elke programmeertaal. Die conversie is het probleem niet maar wel de opslag.

Ik raad je aan om niet zelf timezones te beheren. Als het goed is heeft ofwel je besturingssysteem ofwel je databasesysteem daar voorzieningen voor. En in elk geval die van je besturingssysteem worden bij updates ook meegenomen. PHP gebruikt de definities van je besturingssysteem voor de conversiefuncties

Als je gewoon gebruikt wat PHP aanbiedt aan conversiefuncties, hoef je ook niet bezig te zijn met winter/zomertijd (en heel veel landen gebruiken geen zomer en wintertijd of wijzigen de ingangstijd van zomertijd of wintertijd)

Ik zou dus de begin- en eindtijd van een evenement altijd opslaan als 'tijdstip in tijdzone van locatie van evenement' en de tijdzone erbij, dus voor een evenement in Nederland:
- '2019-07-18 14:00:00'
- 'Europe/Amsterdam'

(overweeg ook het gebruik van PostgreSQL: die kan timestamps met timezone opslaan en de conversie voor je afhandelen)
Ik weet nog niet welke SQL database systeem ik definitief ga gebruiken. De insteek is om alles zo te bedenken / maken dat het niet afhankelijk is van 1 type RDBMS.
Dit zou de migratie van de test omgeving naar een hosting platform een stuk eenvoudiger moeten maken.

Ik weet niet of PostgreSQL al heel veel standaard wordt aangeboden in het hosting landschap.
Voor zover mijn kennis rijkt…., is het voornamelijk MySQL en MariaDB die de boventoon hierin voeren.

Tuurlijk kan je gelijk een dedicated VPS nemen en dus zelf bepalen wat er gedraaid gaat worden.
Kost gelijk een aantal grijpstuivers. Op dit moment zit er geen verdien model achter dit systeem. Moet dus alles eerst uit eigen zak betalen. Weet ook niet of het uberhaupt ooit mogelijk zal zijn om dit kosten neutraal te kunnen laten draaien.
Dit zal natuurlijk afhankelijk zijn of het aanslaat bij de mensen of niet.
En of je daar misschien een kleine vergoeding ooit voor kunt gaan vragen.

Ik ga me eens verdiepen in timezones en DST support van PHP.
En kijken / bedenken hoe dit dan zou moeten gaan werken.

Grt S.O.

Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 23:17
S.O. schreef op woensdag 23 januari 2019 @ 19:36:
[...]
Tuurlijk kan je gelijk een dedicated VPS nemen en dus zelf bepalen wat er gedraaid gaat worden.
Kost gelijk een aantal grijpstuivers. Op dit moment zit er geen verdien model achter dit systeem. Moet dus alles eerst uit eigen zak betalen. Weet ook niet of het uberhaupt ooit mogelijk zal zijn om dit kosten neutraal te kunnen laten draaien.
Ik weet dat het een oud topic is, maar op de meerderheid van je vragen heb ik tenminste een antwoord gegeven en dat waren niet veel topics ;) Hierop was men nog niet ingegaan.

1. Op je eigen ontwikkelmachine bepaal je natuurlijk zelf wat je draait :)
2. Een VPS hoeft zo duur niet te zijn:
€ 4 p/m bij https://contabo.com/?show=vps

We zien je Linux vragen wel verschijnen :p

Houdt er rekening mee dat alle poorten die publiekelijk openstaan binnen een dag overladen worden door bots (uit voornamelijk Rusland en China), dus ook je beveiliging moet vanaf dag 1 op orde zijn.

Sinds de 2 dagen regel reageer ik hier niet meer

Pagina: 1