Il mio esempio potrebbe essere leggermente inventato, perché l'ho modificato in modo che il mio datore di lavoro non riconoscesse il progetto. Sono uno sviluppatore più recente in una società molto piccola.
Abbiamo un oggetto - Posts
- che ha un numero di attributi definiti ( title
, tags
, content
) e un numero sconosciuto di attributi sconosciuti. Questi attributi non sono richiesti, ma fornirli aiuta più tardi nel sistema.
Questi possono essere cose come ip_address
, user agent
, crosspost
, user_account_age
, ecc. Questi non sono noti e nuovi possono essere aggiunti dal sistema in qualsiasi momento. In sostanza, se vogliamo improvvisamente raccogliere un nuovo attributo quando viene creato un post, vogliamo essere in grado di farlo. Gli attributi sono configurati dall'utente finale, non dallo sviluppatore. In questo esempio, sarebbe dalla persona che scrive il post, non dalla persona che ospita il forum.
Come posso modellare questo in Django? Gli attributi personalizzati devono essere ricercabili (cioè trovare tutti i post in cui l'account utente ha meno di un mese di vita, trovare tutti i post pubblicati in cross).
Gli attributi definiti sono abbastanza facili da modellare. Sono quelli personalizzati opzionali che non riesco a capire come modellare o come farlo in modo efficiente.
Il mio primo pensiero, dal punto di vista del database, era di avere solo una tabella chiave / valore dove avrebbe avuto tre colonne: PostId
, key
, value
. Ciò sembra inefficiente anche se tutto dovrebbe essere una stringa perché non posso dichiarare un campo come indirizzo IP, numero intero, ecc. Perché l'attributo potrebbe essere qualsiasi cosa. La query per unirli a questi messaggi sarebbe piuttosto semplice. Devo solo abbinare su PostId
.
C'è un modo migliore per gestirlo?
Il database di back-end può essere qualsiasi cosa, anche se attualmente utilizziamo una combinazione di postgres, mysql e redis. Se c'è un altro strumento che potrebbe aiutare a modellarlo in modo più appropriato, però, possiamo adottarlo.