Stiamo progettando un sistema per definire i gruppi di utenti. I gruppi verranno utilizzati per eseguire query, per indirizzare le promozioni agli utenti pertinenti. Ad esempio, per inviare un'offerta "$ 5 gratuiti se torni questa settimana" agli utenti che non hanno effettuato acquisti in un determinato commerciante in un determinato momento.
Un gruppo è definito da un insieme di filtri, di cui ce ne sono molti. Ad esempio:
- Ha effettuato un acquisto negli ultimi 30 giorni
- È stato acquistato dal commerciante X
- Totale speso superiore a $ 50
Possiamo aspettarci che i nuovi filtri vengano aggiunti regolarmente, come cambiano le esigenze del reparto marketing.
Un gruppo di utenti ha un nome e un set associato di filtri. Ad esempio:
const lapsedMcDonaldsUsers = UserGroup({
name: "Big McDonalds spenders who've lapsed",
filters: [
TotalSpent({greaterThan: 100.00, atMerchant: MCDONALDS_ID}),
DaysSinceLastPurchase({greaterThan: 30, atMerchant: MCDONALDS_ID})
]
})
Qualcuno del reparto marketing definirà i gruppi e i relativi filtri utilizzando un'interfaccia web. Quella definizione verrà archiviata in un database. Saranno quindi in grado di pianificare le e-mail da inviare ai gruppi di utenti. Al momento della trasmissione, verrà eseguita una query basata sui filtri per generare l'elenco dei destinatari.
La domanda è il modo migliore per definire lo schema del database per memorizzare i gruppi di utenti e i filtri. Ecco il mio primo tentativo:
UserGroups
----------
id: primary_key
name: string
Filters
-------
id: primary_key
TotalSpentFilters
-----------------
id: primary_key
filter_id: foreign_key
merchant_id: foreign_key
total_spent: integer
DaysSinceLastPurchaseFilters
----------------------------
id: primary_key
filter_id: foreign_key
merchant_id: foreign_key
days_since: integer
.... (many more)
UserGroupFiltersBindery
-----------------------
id: primary_key
user_group_id: foreign_key
filter_id: foreign_key
Quindi sto usando un modello di ereditarietà della tabella, in cui ogni singolo filtro è definito nella sua tabella, che punta a un record nella tabella generale Filters
. Il UserGroupFiltersBindery
è quindi responsabile del collegamento di un UserGroup
e del suo Filters
.
Pensieri su questo design? Idee da miglioramenti? Possibili problemi?