Chiavi primarie in FileMaker

Una chiave primaria è un campo che identifica un record di una tabella in maniere univoca, e deve essere:
- non vuoto
- unico
Ovviamente può essere usato per le relazioni (anzi, è molto probabile che lo sia), quindi è bene che sia anche indicizzato.
E per definizione, deve essere assegnato automaticamente dal sistema e non visibile all’utente.
Certo, per identificare un record possiamo anche usare dei dati “quasi” unici, come ad esempio il codice fiscale di una persona o la targa di una macchina, ma quel “quasi”, in un Database, fa tutta la differenza del mondo (e comunque non mette al riparo dall’errore umano in fase di inserimento/modifica).
Nel corso degli anni, gli strumenti che FileMaker ci mette a disposizione sono cambiati profondamente. Vediamo quindi che tipo di chiavi primarie possono essere usate in FileMaker.
La tradizione: un campo numerico indicizzato con un numero di serie progressivo.
È la soluzione utilizzata dalla maggior parte dei non sviluppatori, perché è la più immediata e tradizionale (FileMaker stesso la mette come opzione nella definizione di campo). Il problema principale di questo approccio risiede nella coerenza dei numeri di serie fra sistemi diversi, in caso di sincronizzazione tra diversi dispositivi e/o importazione di dati da altre versioni. Un altro effetto indesiderato classico è la possibile confusione fra tabelle diverse ma simili (“aspetta, il cliente 1121 è diverso dal fornitore 1121?!”) e la maggior difficoltà nelle procedure di duplicazione di record che abbiano record correlati in altre tabelle.
L’evoluzione mobile: get(idUU)
Con l’avvento dei database su dispositivi mobili è sorta la necessità di un identificativo unico universale, ovvero una chiave che possa essere univoca anche fra versioni diverse del database. FileMaker quindi propone la funzione get(idUU), che restituisce una stringa di testo di 36 caratteri (ad esempio 4F7D3AB3-FA62-48DC-A0FE-360F1CF168D5 ).
Lo svantaggio di questa soluzione è che risulta meno leggibile rispetto al numero di serie e necessita di un campo di testo.
Il vantaggio è che il valore è unico anche fra i record di tabelle differenti, cosa che riduce la possibilità di errori. Un altro vantaggio è che è possibile creare nuove chiavi direttamente dal motore di calcolo, cosa che semplifica molto le procedure di duplicazione record con annesse tabelle correlate.
Filemaker 17 introduce una funzione che restituisce un identificativo univoco solo numerico, che quindi può essere utilizzato anche nei campi numero: Get ( NumeroIDUU ). FileMaker 17 ha pensato anche allo sviluppatore “distratto”, proponendo automaticamente una serie di campi in ogni nuova tabella, fra cui un campo ID con calcolo proposto con Get(IDUU).
Gli ID nativi
Oltre a quello che può gestire l’utente (la chiave primaria comunque è facoltativa, anche se dovrebbe sempre essere utilizzata), FileMaker ovviamente utilizza anche dei criteri propri per identificare un record specifico. Ogni oggetto in FileMaker ha un suo identificativo specifico: quello dei singoli record di ciascuna tabella può essere ricavato mediante la funzione Get(idRecord), che restituisce un numero che rappresenta il numero del record in ordine di creazione dal primo utilizzo del DB (o dal primo utilizzo da un clone). Avere un campo con questa funzione è fondamentale quando si utilizzano le API, siano le DataAPI introdotte con FileMaker 17 che le API PHP, XML o le API REST di terze parti, che si basano esclusivamente sull’ID nativo di FileMaker per identificare un record.
Cosa utilizzare, quindi?
L’opzione che garantisce più flessibilità è l’utilizzo di get(idUU), in combinazione con un campo con get(idrecord).
L’introduzione del DataMigrationTool indica chiaramente l’orientamento di Claris sulla gestione delle chiavi primarie: DMT cerca per prima cosa come chiave primaria un campo che abbia come inserimento automatico get(idUU), che sia unico, indicizzato e non modificabile successivamente: quindi tutto secondo manuale, anche se l’ultima condizione è un qualcosa che può essere molto fastidioso e limitante a livello di sviluppo e manutenzione.
Responses