Stiamo lavorando a un sistema di evasione degli ordini per un negozio di libri online. Ogni giorno riceviamo decine di file CSV (circa 90 file) con dati sugli ordini acquistati.
Esempio:
OrderId | BookTitle | Quantity | Price | BuyerName | ...
1 |The hunger games | 1 | 10 | John Doe | ...
1 | The Exorcist | 2 | 25 | John Doe | ...
2 | Superman | 1 | 5.5 | Jane Nose | ...
Cosa facciamo attualmente:
I dati devono essere tradotti nel nostro dominio in Order
entità, OrderItem
entità, ... ecc. Carichiamo il file in tabelle fittizie, quindi utilizziamo query molto complesse per popolare la tabella Orders
e la tabella OrderItems
.
Problema:
Tutta la logica aziendale è nel database (nelle query) così unità
testarli è un incubo. Inoltre, ci è stato richiesto di cambiare il database che stiamo usando (non esattamente, ma qualcosa di terrificante simile)
Cosa abbiamo provato:
Ci stiamo spostando verso un approccio DDD in cui il modello di dominio è il nucleo dell'applicazione che contiene tutta la logica e la convalida.
Abbiamo provato ad analizzare il file riga per riga e creare le rispettive entità e convalidarle di conseguenza, quindi salvarle nel database.
Ciò ha comportato migliaia di chiamate al database e talvolta il server esaurisce il coz di memoria delle migliaia di record (circa 90 mila record / file) in un singolo file.
So che questo dominio è obsoleto e qualcuno deve aver trovato un modo migliore per gestire tale compito. Come si elaborano file così grandi nel proprio dominio senza subire prestazioni?
UPDATE
- Usiamo un database MySql con PHP e Apache.
- Il file CSV viene caricato in una tabella fittizia usando qualcosa di simile a questo:
load data local infile 'orders.csv' into table dummyOrders fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(orderId, bookkTitle,Quantity, Price, BuyerName,...)