Skip to content

Instantly share code, notes, and snippets.

@Bilbottom
Created May 9, 2024 06:05
Show Gist options
  • Save Bilbottom/f635d50da51dd96d20d22253cee5656f to your computer and use it in GitHub Desktop.
Save Bilbottom/f635d50da51dd96d20d22253cee5656f to your computer and use it in GitHub Desktop.
Mermaid + DuckDB for generating customer hierarchy diagrams
/*
Mermaid + DuckDB for generating customer hierarchy diagrams
DuckDB version: 0.10.2
Bill Wallis, 2024-05-09
*/
select version();
create or replace table customers (
customer_id varchar not null primary key,
customer_type varchar not null check (
customer_type in ('Business', 'Individual', 'Lending Group')
),
);
create or replace table customer_relationships (
parent_customer_id varchar not null,
child_customer_id varchar not null,
/* "`child_customer_id` is a `relationship_type` of `parent_customer_id`" */
relationship_type varchar not null check (
relationship_type in ('Subsidiary', 'Director')
),
primary key (parent_customer_id, child_customer_id),
foreign key (parent_customer_id) references customers(customer_id),
foreign key (child_customer_id) references customers(customer_id),
);
create or replace table loans (
loan_id varchar not null primary key,
loan_value real not null check (loan_value > 0),
customer_id varchar not null references customers(customer_id),
);
insert into customers (customer_id, customer_type)
values
('BUS364265', 'Business'),
('BUS520654', 'Business'),
('BUS156548', 'Business'),
('BUS216549', 'Business'),
('BUS156044', 'Business'),
('IND154203', 'Individual'),
('IND549804', 'Individual'),
('IND996597', 'Individual'),
('IND450298', 'Individual'),
;
insert into customer_relationships (parent_customer_id, child_customer_id, relationship_type)
values
('BUS520654', 'BUS156548', 'Subsidiary'),
('BUS520654', 'BUS216549', 'Subsidiary'),
('BUS156548', 'IND154203', 'Director'),
('BUS156548', 'IND549804', 'Director'),
('BUS216549', 'IND549804', 'Director'),
('BUS364265', 'IND996597', 'Director'),
('BUS364265', 'IND450298', 'Director'),
('BUS156044', 'IND450298', 'Director'),
;
insert into loans (loan_id, loan_value, customer_id)
values
('LOA156489', 91000, 'BUS156548'),
;
/* Customer Relationships with Loans */
copy (
select 'flowchart TD'
union all
select format(
' {:s} -- {:s} ---> {:s}',
parent_customer_id, relationship_type, child_customer_id
)
from customer_relationships
union all
select format(
' {:s} --- {:s}{{{{"{:s}\n({:t,})"}}}}',
customer_id, loan_id, loan_id, loan_value::int
)
from loans
)
to 'relationships-with-loans.mermaid' (
header false, quote '', delimiter E'\n'
);
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
@Bilbottom
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment