Simplify database schema: remove card_type, card_id, add card_number
Refactor the database schema to better model the data relationships: Schema changes: - Removed cards.card_type (redundant, identical to card_number) - Removed transactions.card_id (unnecessary indirection) - Added transactions.card_number (stores card number for all transactions) - Made cards.customer_id NOT NULL (every card must belong to a customer) - Made transactions.customer_id nullable (NULL for anonymized transactions) Import logic changes: - Only create cards for known customers (transactions with customer_number) - Store card_number for ALL transactions (including anonymized) - Skip cards/customer creation for anonymized transactions Additional changes: - Add 'db reset' command to drop and recreate database - Update migration file with new schema This simplifies queries and better reflects the data model: - Cards table: authoritative mapping of card_number -> customer_id - Transactions table: stores all raw data including anonymized cards - Customer relationship via JOIN on card_number for known customers
This commit is contained in:
+8
-2
@@ -391,22 +391,27 @@ async fn main() -> anyhow::Result<()> {
|
||||
eprintln!("Usage: {} db <subcommand> [--env <name>]", clean_args[0]);
|
||||
eprintln!("Subcommands:");
|
||||
eprintln!(" setup Create database and schema");
|
||||
eprintln!(" reset Drop and recreate database");
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
println!("Environment: {}", env.as_str());
|
||||
let config = Config::load(env)?;
|
||||
let pool = create_pool(&config.database.connection_url()).await?;
|
||||
let repo = Repository::new(pool);
|
||||
|
||||
match clean_args[2].as_str() {
|
||||
"setup" => {
|
||||
let pool = create_pool(&config.database.connection_url()).await?;
|
||||
let repo = Repository::new(pool);
|
||||
commands::run_db_setup(&repo, &config).await?;
|
||||
}
|
||||
"reset" => {
|
||||
commands::run_db_reset(&config).await?;
|
||||
}
|
||||
_ => {
|
||||
eprintln!("Unknown db subcommand: {}", clean_args[2]);
|
||||
eprintln!("Subcommands:");
|
||||
eprintln!(" setup Create database and schema");
|
||||
eprintln!(" reset Drop and recreate database");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
@@ -431,6 +436,7 @@ fn print_usage(program: &str) {
|
||||
eprintln!(" import <csv-file> [--env <name>] Import CSV data to database (default: prod)");
|
||||
eprintln!(" generate <csv> <dir> Generate HTML invoices from CSV");
|
||||
eprintln!(" db setup [--env <name>] Create database and schema (default: prod)");
|
||||
eprintln!(" db reset [--env <name>] Drop and recreate database (default: prod)");
|
||||
eprintln!(" help Show this help message");
|
||||
eprintln!();
|
||||
eprintln!("Environments: prod (default), dev, test");
|
||||
|
||||
Reference in New Issue
Block a user