[Návrh databáze - MySQL] Záznam pohybu sklad. položek

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Ertefol 8. 3. 2017 15:35

Ahoj,
mám navrhnutou databázi viz přiložené schéma - ve zkratce má jít o databázový základ pro aplikaci, která bude pomocí simulace ověřovat dostatečnost kapacity skladu. Na každé skladovací místo se vleze jedna paleta (viz 1:1 vztah mezi Pallette a Position), palety se pak naskladňují při výrobě a vyskladňují při expedici. Beru, že se naskladňují jen kompletní palety a vyskladňují kompletní palety, vratky pro jednoduchost nevedeme.
Původní myšlenka byla počítat kapacitu přes prázdné vs vyplněné cizí klíče u position - když tam paleta je, je přiřazena, když není, tak tam prostě není. Problém nicméně je, že potřebuji evidovat pohyb palet do historie - tedy jak dlouho dané místo zabírala, abych si pak mohl zobrazit, kde zrovna byla a jestli je kapacita dostatečná. Problém je, jak toto evidovat - napadá mě varianta historické tabulky, kde bude id position, id palety a datum naskladnění + datum vyskladnění (jakmile bude paleta vyskladněná, bude mít FK null). Nevím ale, jestli je to dostatečně "elegantní" řešení, popř. jestli někoho nenapadá nějaké lepší. Tabulka by zároveň řešila i možnost "přeskladnění" mezi pozicemi, které bude třeba zvláště kvůli překročení místa: chci totiž nejspíš přidat ještě jednu tabulku "překročené místo" (v podstatě speciální pozice), která bude moci pojmout palety "mimo sklad" - tedy jen "dummy" tabulku s možností přijmout více palet - ať se simulace nezastaví, ale ukáže se, že už bylo překročeno.
Chci si jenom ověřit, že přemýšlím správným směrem (anebo si nechat říct, že na to jdu blbě). Máte někdo nějaký nápad?
Přílohy
sklad.jpg
PC, Wii U, 3DS
"Slabé pohlaví je silnějším pohlavím z důvodu slabosti silnějšího pohlaví k slabšímu pohlaví." - Přísloví
Jakub Kovář, externí redaktor Games, LEVELu, Pevnosti
Ertefol
Junior
Uživatelský avatar

Odeslat příspěvekod karlos00x 9. 3. 2017 14:29

musis pouzit prave mysql? zrovna tady si dokazu predstavit docela dost logiky umistene prave do DB
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod macop 9. 3. 2017 17:24

No mna napadlo toto, Je to iba taky tip :-)

create table Pallete
(
idPallete int,
DAT_date datetime = getdate(),
KOD_pallete string
)

V KOD_pallete bude kod pre operacie, ktore potrebujes, napr...vyskladnenie, naskladnenie...atd.

Ak tam bude KOD_pallete = "VYSKLADNENIE" tak DAT_date bude datum vyskladnenia, atd.

Potom budes vediet kedy je aka palleta vyskladnena alebo naskladnena
macop
Kolemjdoucí

Odeslat příspěvekod Ertefol 9. 3. 2017 22:12

MySQL bohužel použít musím, bude nad tím aplikace v Nette :-/ Ve firmě se to takhle standardizuje, taky bych šel radši do Oracle a udělal si procedury apod.

Jinak kód není špatný, nicméně to by mi hrozně nafouklo tabulku Pallete a šlo by to dost proti ACID - ta tabulka na záznam kdy byl přidán odebrán cizí klíč se mi asi líbí víc, ale potom přemýšlím, jestli jenom nemít tabulku Operace, která má M:N vztahy k Pallete i k Position a řešit to jen přes ni. A na překročené místo tím pádem mít vytvořenu jen jednu speciální Position. Zase si ale na druhou stranu říkám, že ten 1:1 vztah k pozici je dobré omezení a bude se to snadněji řídit.
PC, Wii U, 3DS
"Slabé pohlaví je silnějším pohlavím z důvodu slabosti silnějšího pohlaví k slabšímu pohlaví." - Přísloví
Jakub Kovář, externí redaktor Games, LEVELu, Pevnosti
Ertefol
Junior
Uživatelský avatar

Odeslat příspěvekod macop 9. 3. 2017 23:11

Ahoj, trochu nechapem v com je problem.

Tvoja tabulka Operace bude evidovat v podstate to iste ako tabulka Pallete s KOD_pallete.

1) Tabulka Operace nebude potom nafuktnuta?

2) Nepaci sa mi ze chces nejake obmedzenie spravit cez typ vazby, ja by som to robil cez nejaku podmienku alebo nieco...aby sa to dalo potom jednoducho zmenit.

3) V com moj navrh proti ACID ?

4) -->to by mi hrozně nafouklo tabulku Pallete,... ako zistie historiu pozicie?
macop
Kolemjdoucí

Odeslat příspěvekod Gwyn 10. 3. 2017 08:22

Zdravím,

to co hledáš je event sourcing https://martinfowler.com/eaaDev/EventSourcing.html

Když navíc přestaneš myslet "relačně", tak se dostaneš k tomu, že použít relační databázi na toto řešení není moc efektivní.

Kafka se sice holedbá porporou event soursingu https://kafka.apache.org/uses, ale na konferenci o Mircoservice v Berlíně jsem byl na přednášce, kde to výrazně nedoporučovali. Problémy se zookeepeem, clusterem, apod. Mnohem vhodnější by byl Elasticsearch.

Nette je pouze framework, na to jak jsou modelovaná data, nebo v čem jsou uložená nemá přece použití nette žádný vliv.
Gwyn
Kolemjdoucí

Odeslat příspěvekod powlcz 12. 3. 2017 22:07

Moc pěknej článek.

Nicméně stejně ty data někam bude muset uložit, ať už na to půjde sebeelegantnějším způsobem. Bude potřebovat historii v čase t.

MySql se na tohle úplně nehodí, kdyby alespoň MariaDB... Bude potřeba nějaká údržba indexů, archivace... Záleží o objemu dat
powlcz
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků