Come faccio a creare una colonna (tipo, ID) (aka "polimorfica") - chiave esterna in MS Access?
Domanda
In Ruby-on-Rails, questa è chiamata "associazione polimorfica". "
Ho diverse Commentable
nella mia applicazione, le tabelle per ognuna sono sotto:
Post
id | title | text | author (FK:Person.id) | ...
Person
id | name | ...
Photo
id | title | owner (FK:Person.id) | path | ...
Vorrei aggiungere una tabella Commenti
come segue:
Comments
id | commentable_type | commentable_id | text | author (FK:Person.id)
Capisco che perdo l'integrità referenziale del database in questo modo, ma l'unica altra opzione è avere più tabelle Commenti
: PostComments
, PersonComments
, PhotoComments
, ...
E ora per la domanda:
Come posso creare un modulo che spiegherà come eseguire la ricerca, prima ottenendo il nome della tabella da Comments.commentable_type
e poi l'id da Comments.commentable_id
?
Soluzione
Questa tecnica è conosciuta colloquialmente nel mondo SQL come "sottoclasse". Per un esempio funzionante (sintassi di SQL Server ma facilmente adattabile a MS Access), vedere Blog di David Porta. .
Nel tuo scenario, gli elementi di dati comuni a tutti i commenti sarebbero nella tabella dei commenti; qualcosa di specifico per ogni tipo sarebbe in tabelle specializzate come PhotoComments, ecc. Nota che l'FK dovrebbe essere il composto a due colonne dell'ID più il tipo, qualcosa che è spesso trascurato ma è essenziale per l'integrità referenziale qui ad es. non vuoi che qualcosa digitato come un commento fotografico appaia nella tabella PersonComments.
Altri suggerimenti
Credo che molte persone facciano meta-table per questo genere di cose. Praticamente esattamente come l'hai descritta.