1. A method performed by a data processing apparatus, the method comprising: identifying a first version of a data item to be stored, the first version of a data item having been generated based on modifications to a second version of the data item; determining a first set of permissions associated with the first version of the data item; identifying, in a permissions tree that includes one or more nodes each associated with specific permissions, a first node based on a similarity between the first set of permissions and permissions associated with the first node, the first node being associated with permissions matching the first set of permissions associated with the first version of the data item; wherein identifying the first node comprises: determining whether an existing node of the permissions tree is associated with permissions matching the first set of permissions; if so, identifying that existing node as the first node; if not, generating a new node of the permissions tree associated with the first set of permissions, and identifying the new node as the first node; and storing the first version of the data item at the identified first node of the permissions tree, wherein the permissions tree stores a second version of the data item at a second node, the second node being associated with a second set of permissions not matching the first set of permissions, and wherein permissions of the data item changed between a time at which the second version of the data item was stored in the permissions tree and a time at which the first version of the data item is stored in the permissions tree.