Clarify boundaries between the Registry and Datastore components of the Butler v3 design.
In all designs below, we have at least one database table for each physical Datastore (not Datastore proxies) associated with a Registry, with records for each Dataset. The table(s) store information such as md5sum and size that must have a public interface (which may or may not be direct access to the table itself) and may store format information that may be private to the Datastore. We will call these (for now) Storage Tables (not to be confused with Dataset Metadata tables associated with a particular StorageClass).
Registries don't know about these tables, even if they exist in the same database server. Primary keys for Storage Tables are URIs. URIs are also in Registry's Dataset table. Butler passes URIs between Registry and Datastore Python objects.
Queries on public information must go through an (inefficient) two-stage lookup that involves getting URIs from Registry and then passing URIs to Datastore or (if the information is all in one database) cannot use our interfaces.
Datastores don't know about these tables, and they only contain public storage information fields. Primary keys for Storage Tables are (dataset_id, registry_id) tuples, and each Storage Table record has a URI that encodes the Datastore-private information. Registry's Dataset table does not have URIs. Butler passes URIs between Registry and Datastore Python objects.
Registry has a Storage Table that only contains public storage information, and Datastore has a Storage Table that only contains private format information. Both tables have a URI that does not encode the format information. The two tables may or may not be in the same database. Butler passes URIs between Registry and Datastore Python objects.
Registry and Datastore jointly "own" tables in the same database (probably managed by a new third class). These tables include both standardized public information fields and Datastore-specific format fields, and are keyed by (dataset_id, registry_id). URIs do not exist; Butler passes the (dataset_id, registry_id) tuple between Registry and Datastore objects, which can both use them to access whatever tables they need.
Hybrid of Registry-Managed and Separate in which different Datastores can choose whether to encode format information in the URI or store it in a private table.
Formatter information (how was the file written) should be stored in Datastore private tables (which may live in SQL or in files on disk as preferred in some context by Tim Jenness).
This allows for Datastores to change how files are stored without requiring Registry updates and will prevent breaking of compose-able Datastores.