On Fri, 4 Dec 2020 at 15:39, Marco Colli <collimarc...@gmail.com> wrote:

> Hello!
>
> We have a multi-tenant service where each customer has millions of users
> (total: ~150M rows). Now we would like to let each customer define some
> custom columns for his users and then let the customer search his users
> efficiently based on these columns.
>
> This problem seems really hard to solve with PostgreSQL:
>
> https://stackoverflow.com/questions/5106335/how-to-design-a-database-for-user-defined-fields
>
> In particular the easiest way would be to add a JSON field on the users
> table (e.g. user metadata). However the PostgreSQL GIN index only supports
> exact matches and not range queries. This means that a query on a range
> (e.g. age > 30) would be extremely inefficient and would result in a table
> scan.
>

You could have a table of (tenant, customer, setting_name, setting_value)
so that a btree index on (tenant, setting_name, setting_value) would work
for "select customer from my_table where tenant=$1 and setting_name='age'
and setting_value > 30"

That doesn't deal with setting values having a variety of types, but you
could have a distinct user defined settings table for each setting value
type that you want to support.

Reply via email to