Come posso modellare lo sconosciuto e un numero sconosciuto di attributi su un oggetto?

1

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.

    
posta DjangoNoobie 30.05.2018 - 17:40
fonte

1 risposta

3

Django può memorizzare JSON direttamente nel database con JSONField.  È supportato solo in alcuni database, ma link e link mostra che sia MySQL che PostgreSQL sono sulla lista dov'è.

Non so MySQL, ma so che in PostgreSQL non puoi solo cercare un particolare valore all'interno di JSON, ma puoi anche indicizzarlo. Inoltre il link offre un'opzione eccellente per avere indici solo sulle righe che in realtà hanno un particolare chiave.

    
risposta data 30.05.2018 - 19:20
fonte

Leggi altre domande sui tag