(Version française en dessous)
Yesterday, a colleague asked me the difference between "custom metadata" and "custom objects" for storing "configuration and validation" information in Salesforce.
My answer is:
- Custom metadata if you can. Salesforce says so.
And it survives sandbox refreshes!- Data tables (custom objects) if you truly need it to be part of your data
(e.g. people will want to include it, hyperlinked to other data, in reports).
When I wrote an Apex trigger that determined which User should "own" each "Admissions Application" in our org, I ended up splitting the configuration data in two.
Here's why:
Custom Metadata
Used for a table that helps Apex code ask, "Who does this?"
- key: the code for a graduate degree we offer
- value: a username responsible for recruiting people to that graduate degree
Data (Custom Objects)
Used for a list of U.S. states, their full spellings, and fields with "lookup" links to the User table indicating who does what work for that state.
- There was strong demand to generate native Salesforce reports per User showing all the states they're responsible for and the high schools in those states. It made sense to ensure that the "high school" table could have a "lookup" field to this "states" table.
- Custom metadata can have "master-detail" and "lookup" relational links to other custom metadata, but it can't link to ordinary data.
- This meant we needed to store the the "states" as data (custom objects), even though we would also be using it as configuration information for Apex triggers.
UI & Editability Considerations
I'll let you in on a dirty little secret about another reason I used data tables ("custom objects") for most of the Undergraduate Admissions counselor assignment configuration data.
Undergraduate Admissions tweaks their "recruiter assignment" business rules several times a year. The real-world configuration data for their business is a lot more complex than a simple "list of U.S. states."
I'll be honest: Salesforce's user interfaces for hand-editing, viewing, and bulk-editing data are a lot more end-user-friendly than their user interfaces for the same operations on custom metadata, and setting granular "edit" permissions is a lot more sysadmin-friendly for data. I wanted to make sure end users, not sysadmins, were the ones whose time was spent tweaking the configuration several times a year!
I was thoroughly scolded at Dreamforce. Actually, I stand by my decision to use "data" tables, because there truly is a business need to report on the configuration data alongside normal data. But ... building your own user interfaces (typically using Lightning Components) to help end users edit custom metadata was a big theme. You have been warned:
- Dan Appleman's "Build Awesome Configuration Pages with Lightning Components & Custom Metadata"
- Gustavo Melendez & Krystian Charubin's "Crafting Flexible APIs in Apex Using Custom Metadata"
- Beth Breisness & Randi Wilson's "Create Guided User Experiences for Managing ISV Custom Metadata"
🇫🇷 - en français
Une collègue, peu familière avec Salesforce, m'a demandĂ©e quelle Ă©tait la diffĂ©rence entre « mĂ©tadonnĂ©es personnalisĂ©es » et « objets personnalisĂ©s » pour stocker des donnĂ©es de configuration et de validation dans une organisation Salesforce.
J'ai répondu:
Selon Salesforce, s'il est possible, utilisez des métadonnées personnalisées.
(Elles survivent l'actualisation d'un environnement sandbox.)Stockez vos informations aux tables de bases de données (objets personnalisés) s'il faut créer des relations aux autres objets de votre organisation.
(Par exemple, s'il y a des utilisateurs qui vont générer des rapports sur ces données.)
Mon approche
Lorsque j'ai Ă©crit un dĂ©clencheur Apex pour attribuer les enregistrements de notre objet « demande d'admission » aux utilisateurs corrects, j'ai fini par utiliser les deux approches:
Métadonnées personnalisées
J'ai choisi une type de mĂ©tadonnĂ©es personnalisĂ©es pour stocker des donnĂ©es simples concernant « qui gère chaque spĂ©cialisation ? »
- clé: le code qui indique un diplôme d'études supérieures que l'université offre
- valeur: un nom d'utilisateur chargé de recruter des étudiants au diplôme
Objets personnalisés
J'ai choisi un objet personalisé pour stocker une liste d'états américains (abréviation et nom), avec quelques champs de référence indiquant les utilisateurs qui y gèrent divers aspects du recrutement d'étudiants en license.
- Nos utilisateurs ont besoin de gĂ©nĂ©rer des rapports, regroupĂ©s par utilisateur, avec les Ă©tats qu'ils gèrent et les lycĂ©es qui y sont situĂ©s. Donc il fallait pouvoir crĂ©er une relation de l'objet « lycĂ©e » Ă l'objet « Ă©tat ».
- On peut créer des relations entre métadonnées personnalisées, mais pas entre les types de métadonnées personnalisées et les objets personalisés.
- Donc j'ai choisi un modèle « objet personnalisĂ© » pour stocker les informations Ă propos des Ă©tats, mĂŞme si ces informations servent aussi comme donnĂ©es de configuration pour un dĂ©clencheur Apex.
Considérations au sujet de l'interface utilisateur et au contrôle d'accès
Je vais vous rĂ©vĂ©ler un secret : ce n'est pas qu‘Ă propos des besoins relationnels que j'ai choisi le modèle « objet personnalisĂ© » pour les informations Ă propos de la gestion du recrutement en licence.
Le service admission en license changent les règles de « qui gère quoi » plusieurs fois par an. Et les donnĂ©es de configuration sont, en rĂ©alitĂ©, beaucoup plus complexes qu'une seule liste d'Ă©tats.
Actuellement, les interfaces utilisateur de Salesforce pour voir et enregistrer des donnĂ©es aux objets personnalisĂ©s sont supĂ©rieures Ă celles pour les mĂ©tadonnĂ©es personnalisĂ©es – surtout si l'on est utilisateur ordinaire. Le contrĂ´le d'accès, aussi, est plus facile Ă gĂ©rer pour les administrateurs. Je voulais m'assurer que ça soit des utilisateurs ordinaires qui font plusieurs fois par an cette saisie de donnĂ©es, et non pas les administrateurs !
On m'a fait honte de cette position Ă Dreamforce. Ben, je maintiens ma choix d'objet personnalisĂ© pour raisons de relations entre objets. Mais … on a beaucoup rĂ©pĂ©tĂ© qu'il est de bonne pratique de construire ses propres interfaces utilisateur pour autoriser des utilisateurs ordinaires Ă modifier les mĂ©tadonnĂ©es personnalisĂ©es en toute sĂ©curitĂ©. Je vous aurai prĂ©venus !