clojure-norway

slipset 2025-11-09T10:41:58.050729Z

mrn

msolli 2025-11-09T10:42:05.422369Z

Morn!

leifericf 2025-11-09T12:18:53.622339Z

Morn!

leifericf 2025-11-09T12:20:24.394849Z

Hvilken mentale modell og verktøy bruker dere for å designe/visualisere datamodeller og relasjoner mellom entiteter for Datomic? Vet dere om noen eksempler?

leifericf 2025-11-10T08:00:26.698009Z

Aha! 💡 Så der er «tidsrom» et navnerom som har to datoer og to tider, kanskje?

cjohansen 2025-11-10T08:01:50.483459Z

;; Tidsrom (datoer inklusive til/fra, tider inklusiv fra, eksklusiv til)

    {:db/ident :tidsrom/fra-ld
     :dte/valueType :java.time/local-date
     :db/cardinality :db.cardinality/one}

    {:db/ident :tidsrom/til-ld
     :dte/valueType :java.time/local-date
     :db/cardinality :db.cardinality/one}

    {:db/ident :tidsrom/fra-lt
     :dte/valueType :java.time/local-time
     :db/cardinality :db.cardinality/one}

    {:db/ident :tidsrom/til-lt
     :dte/valueType :java.time/local-time
     :db/cardinality :db.cardinality/one}

    {:db/ident :tidsrom/uke ;; {:år 2025 :ukenummer 9}
     :dte/valueType :edn/data
     :db/cardinality :db.cardinality/one}

💡 1
👀 1
cjohansen 2025-11-10T08:04:15.713349Z

Når det gjelder betraktningen om besøksadresse og postadresse: Det er ikke sikkert den distinksjonen er viktig for deg! Men den er viktig for oss 🙂 Dårlig eksempel, jeg ville allikevel skilt på :bedrift/adresse og :person/adresse uten at jeg helt klarer å føre et flammende argument for hvorfor 😅

leifericf 2025-11-10T08:07:04.785809Z

De eneste forskjellene mellom en fakturaadresse og leveringsadresse, som jeg kan komme på her og nå, er at en leverings adresse for B2B ofte har ytterligere tre verdier: firmanavn, c/o navn (personen som kan ta imot pakken på vegne av bedriften), og kanskje en leveringsinstruks, typ «ta heisen til resepsjonen i 6.etasje og bruk dørkoden 1234.» B2C kunder har sjeldent mer enn én adresse bortsett fra hvis de skal få noe levert til hytta eller til en venn (for eksempel en gave). For B2C kaffeabonnement (som sendes hver måned) kan andressen endres per leveranse, så leveringsadressen til kunden blir «printet» på selve ordren når den blir skapt. B2C kunder kan også gi kaffeabonnement som gave og da er også fakturaadressen og leveringsadressen forskjellige (én privatperson betaler og en annen mottar leveransen).

cjohansen 2025-11-10T08:08:42.893899Z

Fakturaadresse og leveringsadresse kan gjerne peke på samme type entitet. Jeg mener ikke at du trenger :fakturaadresse/linje1 - det er ikke en egen type. Men attributtet som peker på den gir deg noe informasjon om hva slags adresse det er: :kunde/fakturaadresse vs :kunde/leveringsadresse

💡 1
cjohansen 2025-11-10T08:09:27.088599Z

Men her er det noen interessante nyanser. Det kan jo være at en kunde bare har en liste med adresser, og at det er ordre som har leveringsadresse og fakturaadresse.

💯 1
cjohansen 2025-11-10T08:12:04.674019Z

Eller kanskje det holder å modellere adresser på ordre. Når en kunde kommer med en ny bestilling kan du se på tidligere ordre for å foreslå adresser.

cjohansen 2025-11-10T08:12:08.370629Z

😅

leifericf 2025-11-10T08:14:28.006629Z

Jepp! Og jeg vil måtte lage en funksjon for å generere en CSV-fil med alle leveringsadresser som Aya kan bruke for å bestille alle fraktetikettene i batch via Bring og/eller PostNord, typ 50~100 om gangen. Evt. bruke API-ene deres. Og printe etikettene. Da tenker jeg det er mest naturlig og hente ut leveringsadressene fra ordrene og ikke fra kunden. Men forstår jeg rett kan man bruke _ i Datomic for å gå «baklengs» i datahierarkiet og på den måten finne alle de relevante adressene på kundene fra ordrene, så det har kanskje liten praktisk betydning hvor i treet adressene ligger.

cjohansen 2025-11-10T08:17:06.762329Z

Yes!

cjohansen 2025-11-10T08:17:39.101279Z

Pass på å modellere ting der de naturlig hører hjemme. Så lenge det er referanser mellom alle viktige punkter så kan du navigere frem og tilbake til hjertets lyst.

👍 1
leifericf 2025-11-10T08:18:39.812839Z

Det er faktisk helt rått.

cjohansen 2025-11-10T08:19:12.559399Z

Indeed 😄

leifericf 2025-11-10T08:24:33.612189Z

Jeg merker det er nokså rotete i hodet mitt hvordan jeg skal strukturere abonnement (som egentlig bare er «ordrefabrikker»), ordre, ordrelinjer, produkter, og B2B-prisavtaler på produkter. Alle de tingene henger på en måte sammen. Vurderer å ha en «tilbud»-entitet for B2B som «blir til» en ordre når kunden bekrefter i check-out. Og knytte en slags «prisavtale» til produkter og tilbud i forkant, kun for B2B-kunder. Det er også noe utfordrende å modeller lagerlokasjoner og produktbeholdning. Jeg har egentlig veldig god domenekunnskap til slike retail-ting etter nesten 10 år i Elkjøp Nordic + egne bedrifter, men nå ser jeg hvor mye dumt vi gjorde der. Utfordringen jeg har er å ikke havne i samme spor med gamle vaner, og samtidig ta med kunnskapen som faktisk har nytteverdi.

cjohansen 2025-11-10T08:30:29.628429Z

Finnes det ikke ganske mye prior art på produktkatalog, ordre og rabatter osv? SKU-greier?

cjohansen 2025-11-10T08:31:01.560499Z

Dette kan nok du mer om enn meg 😊

leifericf 2025-11-10T08:31:03.412929Z

Evt. lager jeg en «handlepose» som kan fungere både som B2B-«tilbud» og «ikke-bekreftet ordre» for B2C-kunder.

leifericf 2025-11-10T08:33:14.186799Z

Jo, det finnes mye eksisterende materiale å hente inspirasjon fra. Utfordringen er at nesten alle bruker ERP systemer som f.eks. SAP hvor disse tingene er komplisert til ville høyder, eller SQL databaser som ikke «mapper» fra til Datomic. Jeg er derfor litt redd for å lene meg for mye på kunnskap rundt eksisteredene implementasjoner.

cjohansen 2025-11-10T08:33:33.203079Z

Skjønner

cjohansen 2025-11-10T08:33:51.260909Z

Jeg ville helt klart laget noen eksempler på alle casene du trenger. Bare maps og vektorer

👍 1
leifericf 2025-11-10T08:34:00.830129Z

Fordelen jeg har er at jeg har sett alle tingene som suger i den verdenen der 😂

cjohansen 2025-11-10T08:34:04.858529Z

😂

leifericf 2025-11-10T08:38:31.159919Z

En av de mest kjente utfordringene er at produktdata ofte finnes i PIM, som er koblet på nettbutikkene og kassasystemer i butikk. Men alt som har med lager og beholdning å gjøre ligger begravet dypt nedi den sorte ERP-boksen. Det leder ofte til misinformasjon og overslag fordi eCom-plattformen forsøker å konsumere data fra et dusin andre systemer, som vedlikeholdes av forskjellige avdelinger i selskapet. Det er et lappeteppe uten sidestykke.

leifericf 2025-11-10T08:39:37.687099Z

Men nå har jeg ikke tenkt å lage en fullverdig enterprice ERP løsning eller SAP-killer 😂

cjohansen 2025-11-10T08:39:55.502629Z

Hehe, nei, det gjelder å begrense seg til akkurat hva man trenger, uten å male seg inn i et hjørne

💯 1
leifericf 2025-11-10T08:40:32.444849Z

Jepp! Nettopp.

2food 2025-11-10T09:25:12.504399Z

For en stund siden lagde jeg https://github.com/2food/datomic-graph-viz. Datomic har skjema på attributt-nivå, som er veldig bra, men kan gjøre det vanskelig å "se" strukturen og relasjonene mellom entiteter bare fra skjema. Men når du har en database med data så har de en struktur, som man kan vise som en graf. Kanskje ikke så nyttig som designverktøy, for du må ha en database med data i først. Men en artig måte å utforske en datomic database du kanskje ikke kjenner så godt 😊

leifericf 2025-11-10T09:53:23.970509Z

Wow! Kult! > Structure is intentionally not constrained in Datomic, which gives it great structural flexibility. This is one of its really strong features in my opinion. But, the lack of a structural schema can make it difficult to understand and build a mental model of the data, especially if you're new to the db or to Datomic in general. Det er nøyaktig hva jeg sliter med nå 😅

2food 2025-11-10T09:54:35.943079Z

Haha, ja nettopp 😄

2food 2025-11-10T09:58:36.511349Z

Til design-arbeid for datomic-data vil jeg egentlig anbefale å bare tegne sirkler og streker på et whiteboard (eller lignende). Det er en fleksibel graf-database, så alt du kan tegne som en graf kan du veldig lett skrive datomic schema for etterpå.

👀 1
leifericf 2025-11-10T10:08:06.861869Z

Mener du en sirkel per "entitet/navnerom" med en strek mellom hver sirkel hvor et navnerom refererer til en verdi i et annet?

2food 2025-11-10T10:10:35.790219Z

En sirkel for hver entitet, en strek/pil for hver referanse til andre entiteter. 👍

👍 1
leifericf 2025-11-10T10:11:02.445479Z

Skjønner!

leifericf 2025-11-10T10:11:14.629029Z

Også typ en liste med verdier under hver sirkel på en måte?

leifericf 2025-11-10T10:11:49.618549Z

Det blir nesten en flat tabell med verdier som har et navn.

2food 2025-11-10T10:11:57.855239Z

Ja, typ noe sånn. En entitet er en "sekk" med attributt/verdi-par

👍 1
leifericf 2025-11-10T10:12:24.517819Z

Og piler fra enkelte verdier i én liste til andre lister.

🎯 1
leifericf 2025-11-10T10:13:13.474679Z

Så modellerer man bare relasjoner i én retning, sant? Fordi man kan gå baklengs og sidelengs via Datomic uansett.

leifericf 2025-11-10T10:13:37.501309Z

Så det er mer "streker" enn "piler."

leifericf 2025-11-10T10:14:42.511689Z

Slik som den éne brukeren viser på Stack Overflow.

2food 2025-11-10T10:16:39.116749Z

Nettopp 👍 Når man spør på dataene etterpå er det egentlig likegyldig hvilken retning pilen er. Så man kan bare peke i den retningen man selv syns "gir mest mening". Jeg tror eneste tilfellet det betyr noe er hvis du skal bruke :db/isComponent (som gjør at "component" entiteter retractes hvis "parent"-en retractes, litt som "on delete cascade" fra SQL).

👍 1
2food 2025-11-10T10:21:43.483759Z

Så i eksempelbildet der kunne kanskje :article/comment ref-en hatt :db/isComponent true , hvis du vil at en retraction av en artikkel skal retracte kommentarene også.

💡 1
👀 1
slipset 2025-11-10T10:25:32.315969Z

Er ikke dette ganske akkurat hva man ville gjort med en vanlig relasjonsdatabase?

2food 2025-11-10T10:31:06.338949Z

Jo, i utgangspunktet helt likt 😄 I hvert fall ville jeg gjort det

2food 2025-11-10T10:45:43.689109Z

Men det noen ting som gjør at datomic sin datamodell er litt nærmere en "ren" graf-modell, i hvert fall i mitt hode. F.eks. at alt med primær/fremmed-nøkler er håndtert med konseptet om en "ref", og man trenger ikke lage join-tabeller for du kan bare si at en "ref" er :db.cardinality/many. I relasjonsdatabaser vil man også gjerne tenke litt mer igjennom hvilke kolonner man vil ha i hvilke tabeller osv, siden det er litt "stress" å utvide en eksisterende tabell senere. Det kan man utsette mer med datomic siden det er så lett å "gro" med å legge til attributter senere. Så man kan fokusere mest på bare entiteter og relasjoner i begynnelsen.

👍 1
leifericf 2025-11-10T11:01:27.529129Z

Er ikke dette ganske akkurat hva man ville gjort med en vanlig relasjonsdatabase?Med en relasjonsdatabase har jeg pleid å bruke "streker med føtter og dører" for å visualisere én-til-én relasjoner, én-til-mange relasjoner, hvilke retninger en kan gå, etc. Det blir fort mer komplisert. Med Datomic trenger man heller ikke info om primary keys og foreign keys.

leifericf 2025-11-10T11:05:30.066979Z

Med Datomic trenger man bare enkle piler som peker én vei (eller bare rette linjer), hvis jeg forstår rett.

leifericf 2025-11-10T21:31:58.859509Z

https://youtu.be/H854fF6K2_o @ 44:39: > “Other things besides stories can have comments, so I’m going to put that in a different namespace.” Ref. dialogen om adresser tidligere i tråden. Stu prater spesifikt om samme problemstilling der. Veldig nyttig!

👍 1
leifericf 2026-01-05T08:47:03.684479Z

https://clojurians.slack.com/archives/C03RZMDSH/p1766438407612629?thread_ts=1606928463.043600&cid=C03RZMDSH av modellen til https://github.com/Datomic/codeq er ganske fin! Jeg legger den inn i tråden her til fremtidige Slack-arkeologer.

👍 2
leifericf 2025-11-09T12:26:43.862709Z

Ah! Det er tydeligvis andre som har lignende spørsmål. Fant en del god info https://stackoverflow.com/questions/10357778/data-modeling-in-datomic.

leifericf 2025-11-09T12:40:11.824549Z

Tror jeg må starte med å beskrive entiteter med vanlig prosa uten å tenke på noe teknisk og implementasjonsdetaljer. Hjernen min dro umiddelbart i retningen denormalisert og relasjonell modellering á la SQL, men så oppdaget fort ut at det ikke funker i Datomic på en grunnleggende konseptuelt nivå. Dagens påminnelse: Det er vanskelig å «glemme» det en har lært tidligere og tenke på en annerledes måte.

slipset 2025-11-09T13:51:37.539349Z

Jeg pleier å bruke hodet. Og whiteboard noen ganger. Jeg tror det jeg prøver å si er at enten så forstår jeg datamodellen, og da får den greit plass i hodet, eller så gjør jeg ikke det, og da hjelper ingen diagrammer/verktøy.

👍 1
leifericf 2025-11-09T14:20:45.495169Z

Jeg føler at jeg har relativt grei kontroll på hvilke «ting» appen består av i hodet mitt. Men jeg er ikke sikker på om modellen er «korrekt» og tror kanskje det hadde blitt enklere for meg å tenke på ting hvis jeg ser det med øynene samtidig. Skal prøve å få det ut av hodet og ut i verdenen.

leifericf 2025-11-09T14:49:32.073339Z

Jeg er ikke like god på å gjøre ting i hodet og ser ofte ikke feilene mine før jeg får med meg hendene og øynene.

slipset 2025-11-09T15:16:37.206609Z

Det er derfor jeg gjerne liker å leke med det i kode også. Det er først da jeg klarer å finne ut av ting. Men da er det gunstig at det går superfort å test/endre og at man ikke må gjøre tusen ting (endre tabeller, typer, interfaces, whatnot) for hver endring du gjør.

👍 1
cjohansen 2025-11-10T06:42:02.975929Z

Jeg utformer datamodeller ved å tenke på hvilke attributter jeg trenger, gjerne eksemplifisert med noen maps. Jeg bruker gjerne litt tid på å finne gode navn. Ofte løsner det når du finner de rette navnene.

👀 1
cjohansen 2025-11-10T06:44:19.487079Z

Alt som trenger å adresseres på utsiden av systemet (URL-er osv) får en syntetisk id, typisk :roast/id denne kan være en uuid som er lett å lage, men aller helst noe kortere og mer menneskevennlig/lesbart

👀 1
leifericf 2025-11-10T06:59:14.266459Z

Ah! Så det er mer en «bottom-up» tilnærming hvor du finner ut av alle verdiene som trengs først? Når du har funnet de fleste verdiene og gitt dem gode navn så grupperer du dem inn i logiske «domener/entiteter» ved hjelp av navnerom? Det var et enkelt og nyttig tips, @christian767.

cjohansen 2025-11-10T07:02:57.360729Z

Attributtene kommer gjerne med navnerom, så strukturen kommer på plass as you go

cjohansen 2025-11-10T07:03:25.282779Z

Fint å ha noen konkrete eksempler å jobbe med også

leifericf 2025-11-10T07:04:11.749289Z

En ting jeg lurer på da er hvis flere entiteter trenger samme verdier. For eksempel trenger både bedrifter og personer én eller flere adresser, f.eks. en fakturaadresse og en leveringsadresse. Kanskje flere. Gir det da mening og ha et eget/separat «domene/navnerom» for adresser, som både bedrifter og personer kan «bruke?» Hvor én adresse består av flere verdier som f.eks. linje 1, linje 2, postnummer, poststed, land, og kanskje en merkelapp som «Hjem» eller «Jobb». Eller ville du «duplisert» de verdiene direkte i bedrift og person navnerommene?

cjohansen 2025-11-10T07:06:29.184269Z

Godt spørsmål! Om attributtet kun indikerer eierskap, altså det er en referanse til en entitet, så gir jeg dem unike navn. Det er nok beskrivende for adresse-eksempelet: :bedrift/postadresse

👍 1
cjohansen 2025-11-10T07:07:15.274369Z

Hvis du skal gjenbruke samme attributt er det nyttig å stille spørsmålet "er dette samme ting?". En besøksadresse er ikke det samme som en postadresse.

🤔 1
cjohansen 2025-11-10T07:07:36.686749Z

(Selv om de kan være like)

👍 1
cjohansen 2025-11-10T07:09:42.764649Z

Vi har en del ting i vår modell som representerer et tidsrom. De tingene deler attributter:

{:avtale/id "..."
 :tidsrom/fra-lt "12:00"
...}

👀 1