When integrating perforce, there are situations where users want to store additional metadata for a given object (most likely changelists, but also labels, clients, users, etc.).
Keys can be (and are being) used as an imperfect substitute, but this approach suffers from significant limitations:
* Keys are decoupled from the objects, so attributes are not automatically deleted with the corresponding object. And it can be difficult to find attributes for changelists because changelist ids are updated after submit.
* Keys can not be used in server-side queries (e.g. return list of all changelists that have been reviewed by user "foo", return list of labels with the "release" flag set); instead all keys must be read and processed by clients.
* If a single key is used to store multiple attributes (perhaps stored as a JSON encoded string), it is more likely that multiple writers for different attributes will overwrite each other when they do a read-modify-write on the value (unless some an external locking scheme is used); If multiple keys are used to store individual attributes, they can more expensive to fetch.
Perforce supports attributes on files, this should be generalized to support attributes for all objects.