<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by gradle vo-dml tools 2025-08-06T12:10:39.069537+01:00-->
<tap:tapschemaModel xmlns:tap="http://ivoa.net/dm/tapschema/v1"
                    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <schema>
      <schema_name>caom2</schema_name>
      <description>a general purpose data model for use as the core data model of an astronomical data centre</description>
      <tables>
         <table>
            <table_name>Entity</table_name>
            <table_type>table</table_type>
            <utype>caom2:Entity</utype>
            <description>This is a base class to persistence. The entity attributes are generally set
                           or updated by persistence implementations.</description>
            <columns>
               <column>
                  <column_name>caom2.Entity.id</column_name>
                  <!--attribute of primitiveType caom2:uuid-->
                  <datatype>VARCHAR</datatype>
                  <description>The id is a globally unique identifier (primary key) for an instance.</description>
                  <utype>caom2:Entity.id</utype>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Entity.lastModified</column_name>
                  <!--attribute of primitiveType ivoa:datetime-->
                  <datatype>TIMESTAMP</datatype>
                  <description>The timestamp of last modification of this entity tracks changes in metadata and
                                 supports incremental operations. The timestamp is intended to be set and/or updated
                                 when the entity is stored (e.g. in a database).</description>
                  <utype>caom2:Entity.lastModified</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Entity.metaChecksum</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This checksum of the metadata in this entity signals a change in the metadata of an
                                 instance and supports validation (e.g. to compare metadata before and after serialisation or
                                 persistence). A change in the metaChecksum can also be used to optimise operations like
                                 updating a row in the database only when the metaChecksum changed. A change in metaChecksum
                                 normally triggers a change in the lastModified timestamp.
                 
                                 The URI must conform to the pattern {algorithm}:{hex value}, for example:
                                 \begin{verbatim}md5:4be91751541fd804e7207663a0822f56.\end{verbatim}
                 
                                 The checksum of an entity is computed by accumulating byte representation of individual metadata values in
                                 the following order: (1) Entity.id for entities, (2) Entity.metaProducer, (3) state fields in alphabetic order
                                 (foo.a comes before foo.b) and using depth-first recursion (foo.abc.x comes before foo.def). The lastModified
                                 timestamp is not included in the metaChecksum calculation. Null values are ignored so that the addition of
                                 new fields in future versions will not change/invalidate existing checksums. Non-null values are converted to
                                 bytes as follows:
                                 \begin{itemize}
                                 \item string: UTF-8 encoded bytes
                                 \item URI: UTF-8 encoded bytes of the string representation
                                 \item VocabularyTerm: UTF-8 encoded bytes of the term (do not include the namespace)
                                 \item enumeration: the literal value converted to bytes
                                 \item float: IEEE754 single (4 bytes)
                                 \item double: IEEE754 double (8 bytes)
                                 \item boolean: convert to single byte, false=0, true=1 (1 byte)
                                 \item byte: as-is (1 byte)
                                 \item short: (2 bytes, network byte order == big endian))
                                 \item integer: (4 bytes, network byte order == big endian)
                                 \item long: (8 bytes, network byte order == big endian)
                                 \item date: treat as a long (milliseconds since 1970-01-01 00:00:00 UTC)
                                 \end{itemize}
                 
                                 TODO: truncatedDates=false, digestFieldNames=true, digestFieldnamesLowerCase=true
                 
                                 TODO: external data model components: recursion or specify conversion above (interval, point,
                                 shape, multishape)
                                 </description>
                  <utype>caom2:Entity.metaChecksum</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Entity.metaProducer</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This identifier is used to identify the tools used to produce the metadata. It also
                                 implicitly applies to child entities with null metaProducer. The form of the URI is not specified;
                                 implementations are free to use this to track metadata curation. For example, a pattern like
                                 {organisation}:{software name}-{version} is useful to support a variety of operational uses:
                                 query for metadata created by a version with a known bug or query for metadata created by an older version
                                 of the software and perform updates.
                             </description>
                  <utype>caom2:Entity.metaProducer</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>CaomEntity</table_name>
            <table_type>table</table_type>
            <utype>caom2:CaomEntity</utype>
            <description>This is an extension of the base Entity class to support accumulated metadata checksums
                           and accumulated lastModified timestamps for entities with child entities.</description>
            <columns>
               <column>
                  <column_name>caom2.CaomEntity.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for CaomEntity</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.CaomEntity.maxLastModified</column_name>
                  <!--attribute of primitiveType ivoa:datetime-->
                  <datatype>TIMESTAMP</datatype>
                  <description>The maximum last modification timestamp of this entity and all child entities is used
                                 to support incremental synchronization (of Observation instances). As with the instance lastModified
                                 timestamp above, this timestamp is intended to be set and/or updated when the entity is stored
                                 (e.g. in a database).</description>
                  <utype>caom2:CaomEntity.maxLastModified</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.CaomEntity.accMetaChecksum</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>accumulated checksum of the metadata of this entity and all child entities;
                 
                                 The URI must conform to the pattern {algorithm}:{hex value}, for example:
                                 \begin{verbatim}md5:4be91751541fd804e7207663a0822f56.\end{verbatim}
                 
                                 The accumulated checksum of an entity is computed by accumulating the byte representation of entity checksums
                                 in the following order: (1) the metaChecksum of the current entity, (2) the accMetaChecksum of all child entities
                                 accumulated in order of the child's Entity.id. For an entity with no children, the accMetaChecksum is derived
                                 only from the metaChecksum but it is not equal to it because it is a checksum of that checksum and not a checksum
                                 of the same metadata directly.
                                 </description>
                  <utype>caom2:CaomEntity.accMetaChecksum</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_caom2.CaomEntity</key_id>
                  <target_table>Entity</target_table>
                  <description>join back to supertype caom2:Entity</description>
                  <utype>caom2:CaomEntity</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.CaomEntity.id</from_column>
                        <target_column>caom2.Entity.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>DeletedArtifactDescriptionEvent</table_name>
            <table_type>table</table_type>
            <utype>caom2:DeletedArtifactDescriptionEvent</utype>
            <description>an event signifiying that a previously persisted ArtifactDescription was deleted;
                           this event can be synchronized to propagate deletions; the Entity.id of the event
                           is equal to the Entity.id of the deleted observation and this identifier is used
                           when performing deletions</description>
            <columns>
               <column>
                  <column_name>caom2.DeletedArtifactDescriptionEvent.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for DeletedArtifactDescriptionEvent</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.DeletedArtifactDescriptionEvent.uri</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>The logical identifier of the ArtifactDescription: the ArtifactDescription.uri
                                 value; this is for informational purposes only</description>
                  <utype>caom2:DeletedArtifactDescriptionEvent.uri</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_caom2.DeletedArtifactDescriptionEvent</key_id>
                  <target_table>Entity</target_table>
                  <description>join back to supertype caom2:Entity</description>
                  <utype>caom2:DeletedArtifactDescriptionEvent</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.DeletedArtifactDescriptionEvent.id</from_column>
                        <target_column>caom2.Entity.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>DeletedObservationEvent</table_name>
            <table_type>table</table_type>
            <utype>caom2:DeletedObservationEvent</utype>
            <description>an event signifiying that a previously persisted Observation was deleted;
                           this event can be synchronized to propagate deletions; the Entity.id of the event
                           is equal to the Entity.id of the deleted observation and this identifier is used
                           when performing deletions</description>
            <columns>
               <column>
                  <column_name>caom2.DeletedObservationEvent.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for DeletedObservationEvent</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.DeletedObservationEvent.uri</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>The logical identifier of the Observation: the Observation.uri value; this
                                 is for informational purposes only</description>
                  <utype>caom2:DeletedObservationEvent.uri</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_caom2.DeletedObservationEvent</key_id>
                  <target_table>Entity</target_table>
                  <description>join back to supertype caom2:Entity</description>
                  <utype>caom2:DeletedObservationEvent</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.DeletedObservationEvent.id</from_column>
                        <target_column>caom2.Entity.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>Observation</table_name>
            <table_type>table</table_type>
            <utype>caom2:Observation</utype>
            <description>The observation is the top-level metadata structure that describes astronomical
                           data in a data collection.</description>
            <columns>
               <column>
                  <column_name>caom2.Observation.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for Observation</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.collection</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>The name of the data collection to which this observation belongs.</description>
                  <utype>caom2:Observation.collection</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.uri</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>A unique logical identifier for this observation. (NEW in CAOM-2.5)
                                 TODO: limit this to one of two forms that support use cases?</description>
                  <utype>caom2:Observation.uri</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.uriBucket</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a short string of hexadecimal digits generated from the uri to support
                                 operational use cases (mainly: dividing workload to perform validation in parallel). The
                                 value is the first three characters of the hexadecimal representation of SHA-1 of the UTF-8
                                 encoded bytes of the Observation.uri value. (NEW in CAOM-2.5)</description>
                  <utype>caom2:Observation.uriBucket</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.metaRelease</column_name>
                  <!--attribute of primitiveType ivoa:datetime-->
                  <datatype>TIMESTAMP</datatype>
                  <description>This timestamp specifies the point where the metadata for the observation instance is public
                                 (can be viewed by anonymous users). A null value means the metadata is nont public.</description>
                  <utype>caom2:Observation.metaRelease</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.sequenceNumber</column_name>
                  <!--attribute of primitiveType ivoa:integer-->
                  <datatype>INTEGER</datatype>
                  <description>a collection-specific sequence number for observations; re-use or reset is collection specific</description>
                  <utype>caom2:Observation.sequenceNumber</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.type</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>This describes the general purpose of observation (e.g. FITS OBSTYPE keyword). Existing usage is
                                 usually OBJECT for intent = science and other values for intent = calibration.</description>
                  <utype>caom2:Observation.type</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.intent</column_name>
                  <!--attribute of enumeration caom2:ObservationIntentType-->
                  <datatype>VARCHAR</datatype>
                  <description>This is an enumeration that describes the intent of the original creator of the observation.</description>
                  <utype>caom2:Observation.intent</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observation.metaReadGroups</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a set of groups with read permission on observation metadata for cases when the metadata
                                 is non-public (see metaRelease above).</description>
                  <utype>caom2:Observation.metaReadGroups</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_caom2.Observation</key_id>
                  <target_table>CaomEntity</target_table>
                  <description>join back to supertype caom2:CaomEntity</description>
                  <utype>caom2:Observation</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Observation.id</from_column>
                        <target_column>caom2.CaomEntity.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>SimpleObservation</table_name>
            <table_type>table</table_type>
            <utype>caom2:SimpleObservation</utype>
            <description>A simple observation is created directly by operating a telescope and instrument (for
                           empirical data) or by a process (for simulation data). Existing usage: the Algorithm.name values
                           'exposure' and 'simulation' are reserved for these cases respectively.</description>
            <columns>
               <column>
                  <column_name>caom2.SimpleObservation.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for SimpleObservation</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_caom2.SimpleObservation</key_id>
                  <target_table>Observation</target_table>
                  <description>join back to supertype caom2:Observation</description>
                  <utype>caom2:SimpleObservation</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.SimpleObservation.id</from_column>
                        <target_column>caom2.Observation.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>DerivedObservation</table_name>
            <table_type>table</table_type>
            <utype>caom2:DerivedObservation</utype>
            <description>A derived observation is an observation created from one or more other observations.
                           Examples of multiple members include: stacks of images combined to increase signal:noise ratio,
                           mosaics combined to increase field-of-view, etc. Examples of single members: subset of comensurally
                           observed data that is attributed/assigned to one proposal or project (with associated permissions).</description>
            <columns>
               <column>
                  <column_name>caom2.DerivedObservation.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for DerivedObservation</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.DerivedObservation.members</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>The members are the observations grouped together by the algorithm that defines the derivation.
                                 these are the intended components of the composite product, but actual inputs are described by the provenance.
                                 Members may be simple or derived observations (arbitrary heirarchy); derived observations with
                                 one or more members may be defined such that they only include a subset of each member (they are extracted from
                                 the progenitor). Observation.uri values are used here to refer to the member observations.
                             </description>
                  <utype>caom2:DerivedObservation.members</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_caom2.DerivedObservation</key_id>
                  <target_table>Observation</target_table>
                  <description>join back to supertype caom2:Observation</description>
                  <utype>caom2:DerivedObservation</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.DerivedObservation.id</from_column>
                        <target_column>caom2.Observation.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>Plane</table_name>
            <table_type>table</table_type>
            <utype>caom2:Plane</utype>
            <description>A plane is a component of an observation that describes one product of the observation.</description>
            <columns>
               <column>
                  <column_name>caom2.Plane.OBSERVATION_ID</column_name>
                  <datatype>VARCHAR</datatype>
                  <description>foreign key column for caom2:Observation composition of caom2:Plane</description>
                  <utype>caom2:Observation</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for Plane</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.uri</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>A unique logical identifier for this plane. Values of this identifier are used in
                                 Plane.provenance.inputs to form a reference from a product to it's progenitors.
                                 TODO: limit this to one of two forms that support use cases? (NEW in CAOM-2.5)</description>
                  <utype>caom2:Plane.uri</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.metaRelease</column_name>
                  <!--attribute of primitiveType ivoa:datetime-->
                  <datatype>TIMESTAMP</datatype>
                  <description>This timestamp specifies the point where the metadata for the plane instance is public
                                 (can be viewed by anonymous users). A null value means the metadata is not public. The metaRelease
                                 timestamp applies to the plane metadata itself and to all artifacts with releaseType=meta.</description>
                  <utype>caom2:Plane.metaRelease</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.metaReadGroups</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a set of groups with read permission on plane metadata for cases when the metadata
                                 is non-public (see metaRelease above).</description>
                  <utype>caom2:Plane.metaReadGroups</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.dataRelease</column_name>
                  <!--attribute of primitiveType ivoa:datetime-->
                  <datatype>TIMESTAMP</datatype>
                  <description>This timestamp specifies the point where the metadata for the plane instance is public
                                 (can be viewed by anonymous users). A null value means the metadata is not public. The dataRelease
                                 timestamp applies to all artifacts with releaseType=data.</description>
                  <utype>caom2:Plane.dataRelease</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.dataReadGroups</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a set of groups with read permission on plane data for cases when the data
                                 is non-public (see dataRelease above).</description>
                  <utype>caom2:Plane.dataReadGroups</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.calibrationLevel</column_name>
                  <!--attribute of enumeration caom2:CalibrationLevel-->
                  <datatype>VARCHAR</datatype>
                  <description>This describes the degree to which the data is calibrated; it is equivalent to the
                                 ObsCore calibration level field.</description>
                  <utype>caom2:Plane.calibrationLevel</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Plane.dataProductType</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>standard classification of the type of data product; describes the logical data type
                                         for the main artifacts</description>
                  <utype>caom2:Plane.dataProductType</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_Observation.planes</key_id>
                  <!--back reference to caom2:Plane composition in caom2:Observation -->
                  <target_table>Observation</target_table>
                  <description>foreign key for caom2:Plane composition in caom2:Observation </description>
                  <utype>caom2:Observation.planes</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Plane.OBSERVATION_ID</from_column>
                        <target_column>caom2.Observation.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
               <foreignKey>
                  <key_id>FK_caom2.Plane</key_id>
                  <target_table>CaomEntity</target_table>
                  <description>join back to supertype caom2:CaomEntity</description>
                  <utype>caom2:Plane</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Plane.id</from_column>
                        <target_column>caom2.CaomEntity.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>Artifact</table_name>
            <table_type>table</table_type>
            <utype>caom2:Artifact</utype>
            <description>a physical product (typically a file)</description>
            <columns>
               <column>
                  <column_name>caom2.Artifact.PLANE_ID</column_name>
                  <datatype>VARCHAR</datatype>
                  <description>foreign key column for caom2:Plane composition of caom2:Artifact</description>
                  <utype>caom2:Plane</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for Artifact</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.uri</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This identifier can be used to interact with an associated data management system.
                                 Existing usage: this is an internal identifier that an IVOA DataLink service can
                                 convert into a usable link to the data. TODO: There is an informal style used to make sure
                                 that these identifiers are globally unique and avoid collisions...</description>
                  <utype>caom2:Artifact.uri</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.uriBucket</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a short string of hexadecimal digits generated from the uri to support
                                 operational use cases (mainly: dividing workload to perform validation in parallel). The
                                 value is the first three characters of the hexadecimal representation of SHA-1 of the UTF-8
                                 encoded bytes of the Observation.uri value. (NEW in CAOM-2.5)</description>
                  <utype>caom2:Artifact.uriBucket</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.productType</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>the relationship of this Artifact to the parent Plane (DataLink semantics)</description>
                  <utype>caom2:Artifact.productType</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.releaseType</column_name>
                  <!--attribute of enumeration caom2:ReleaseType-->
                  <datatype>VARCHAR</datatype>
                  <description>This field indicates whether this artifact is treated as data or metadata when determining
                                 access permission. Existing usage: some collections have small previews (productType=thumbnail)
                                 that are considered metadata and are thus viewable by all users.</description>
                  <utype>caom2:Artifact.releaseType</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.contentType</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>This field specifies the format of the resolved artifact: should be a MIME-type.</description>
                  <utype>caom2:Artifact.contentType</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.contentLength</column_name>
                  <!--attribute of primitiveType ivoa:integer-->
                  <datatype>INTEGER</datatype>
                  <description>This specifies the size of the stored artifact; for files, this is the file size.</description>
                  <utype>caom2:Artifact.contentLength</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.contentChecksum</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>this is the checksum of the artifact data;
                                 the URI must conform to the pattern {algorithm}:{hex value}, for example:
                                 \begin{verbatim}
                                 md5:4be91751541fd804e7207663a0822f56
                                 \end{verbatim}</description>
                  <utype>caom2:Artifact.contentChecksum</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.contentRelease</column_name>
                  <!--attribute of primitiveType ivoa:datetime-->
                  <datatype>TIMESTAMP</datatype>
                  <description>This timestamp after which content for the artifact is public. If set, this value
                                 overrides the permission implied by the releaseType and Plane release dates.
                                 Existing usage: MAST?.</description>
                  <utype>caom2:Artifact.contentRelease</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.contentReadGroups</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>Thsi is a set of groups that are allowed to access the content of this artifact. If set,
                                 thisd overrides the permission implied by the releaseType and PLane release groups.
                                 Existing usage: unknown.</description>
                  <utype>caom2:Artifact.contentReadGroups</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Artifact.descriptionID</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This is an identifier to refer to an ArtifactDescription entity. (new in CAOM-2.5)
                                 Use case: provide standard descriptions for links in a DataLink response.</description>
                  <utype>caom2:Artifact.descriptionID</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_Plane.artifacts</key_id>
                  <!--back reference to caom2:Artifact composition in caom2:Plane -->
                  <target_table>Plane</target_table>
                  <description>foreign key for caom2:Artifact composition in caom2:Plane </description>
                  <utype>caom2:Plane.artifacts</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Artifact.PLANE_ID</from_column>
                        <target_column>caom2.Plane.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
               <foreignKey>
                  <key_id>FK_caom2.Artifact</key_id>
                  <target_table>CaomEntity</target_table>
                  <description>join back to supertype caom2:CaomEntity</description>
                  <utype>caom2:Artifact</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Artifact.id</from_column>
                        <target_column>caom2.CaomEntity.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>ArtifactDescription</table_name>
            <table_type>table</table_type>
            <utype>caom2:ArtifactDescription</utype>
            <description>The provides a referenceable description of artitfacts for use in DataLink responses. (NEW in CAOM-2.5)</description>
            <columns>
               <column>
                  <column_name>caom2.ArtifactDescription.id</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>VARCHAR</datatype>
                  <description>primary/join key for ArtifactDescription</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.ArtifactDescription.uri</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>This is the logical identifier for this description used to refer to it from an artifact.
                                 Anticipated usage: this is an internal identifier that an IVOA DataLink service can
                                 use to lookup a description. TODO: There is an informal style used for Atifact.uri to make sure
                                 that these identifiers are globally unique and avoid collisions...</description>
                  <utype>caom2:ArtifactDescription.uri</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.ArtifactDescription.description</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>A human-readable description of an artifact.</description>
                  <utype>caom2:ArtifactDescription.description</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_caom2.ArtifactDescription</key_id>
                  <target_table>Entity</target_table>
                  <description>join back to supertype caom2:Entity</description>
                  <utype>caom2:ArtifactDescription</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.ArtifactDescription.id</from_column>
                        <target_column>caom2.Entity.id</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>Algorithm</table_name>
            <table_type>table</table_type>
            <utype>caom2:Algorithm</utype>
            <description>the algorithm that was responsible for creating the observation; for a DerivedObservation this is the 
                           algorithm that defines the intended set of members to include
                       </description>
            <columns>
               <column>
                  <column_name>caom2.Algorithm.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Algorithm</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Algorithm.name</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>common name of the algorithm; the value 'exposure' is reserved for use in SimpleObservation; 
                                 TBD: publish a list of acceptable values as a machine-readable vocabulary?</description>
                  <utype>caom2:Algorithm.name</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Telescope</table_name>
            <table_type>table</table_type>
            <utype>caom2:Telescope</utype>
            <description>the telescope used to acquire the data for an observation</description>
            <columns>
               <column>
                  <column_name>caom2.Telescope.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Telescope</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Telescope.name</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>common name of the telescope; 
                                 TBD: reference to a standard list of names?</description>
                  <utype>caom2:Telescope.name</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Telescope.geoLocationX</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>x-coordinate of the geocentric location of the telescope at the time of observation
                                 (see FITS WCS Paper III)</description>
                  <utype>caom2:Telescope.geoLocationX</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Telescope.geoLocationY</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>y-coordinate of the geocentric location of the telescope at the time of observation
                                 (see FITS WCS Paper III)</description>
                  <utype>caom2:Telescope.geoLocationY</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Telescope.geoLocationZ</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>z-coordinate of the geocentric location of the telescope at the time of observation
                                 (see FITS WCS Paper III)</description>
                  <utype>caom2:Telescope.geoLocationZ</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Telescope.keywords</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>additional keywords that describe the telescope or telscope configuration 
                                 at the time of observation; 
                                 keywords cannot contain the pipe (|) character - it is reserved for use in persistence
                                 systems (e.g. to store all keywords in a single column in a table)
                             </description>
                  <utype>caom2:Telescope.keywords</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Telescope.trackingMode</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>term from the (currently non-existent) IVOA Tracking vocabulary used to
                                 indicate how the telescope moves during data acquisition</description>
                  <utype>caom2:Telescope.trackingMode</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Instrument</table_name>
            <table_type>table</table_type>
            <utype>caom2:Instrument</utype>
            <description>the instrument used to acquire or create the observation; this could be used for both physical
                       instruments that acquire data or software that generates it (e.g. simulated data)</description>
            <columns>
               <column>
                  <column_name>caom2.Instrument.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Instrument</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Instrument.name</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>common name for the instrument</description>
                  <utype>caom2:Instrument.name</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Instrument.keywords</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>additional keywords that describe the instrument or instrument configuration
                                 at the time of observation; 
                                 keywords cannot contain the pipe (|) character - it is reserved for use in persistence
                                 systems (e.g. to store all keywords in a single column in a table)</description>
                  <utype>caom2:Instrument.keywords</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Environment</table_name>
            <table_type>table</table_type>
            <utype>caom2:Environment</utype>
            <description>collection of measured quantities that characterise the environment 
                           at the time of observation</description>
            <columns>
               <column>
                  <column_name>caom2.Environment.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Environment</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Environment.name</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>typical atmospheric distortion (full-width-half-max of a point source)</description>
                  <utype>caom2:Environment.name</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Environment.humidity</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>fractional relative humidity [0,1]</description>
                  <utype>caom2:Environment.humidity</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Environment.elevation</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>angular elevation above horizon [0,90]</description>
                  <utype>caom2:Environment.elevation</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Environment.tau</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>the opacity of the atmosphere [0,1]</description>
                  <utype>caom2:Environment.tau</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Environment.wavelengthTau</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>wavelength at which opacity was measured</description>
                  <utype>caom2:Environment.wavelengthTau</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Environment.ambientTemp</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>ambient temperature at the telescope</description>
                  <utype>caom2:Environment.ambientTemp</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Environment.photometric</column_name>
                  <!--attribute of primitiveType ivoa:boolean-->
                  <datatype>INTEGER</datatype>
                  <description>indicator that flux and/or color calibration is stable</description>
                  <utype>caom2:Environment.photometric</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Proposal</table_name>
            <table_type>table</table_type>
            <utype>caom2:Proposal</utype>
            <description>description of the science proposal or programme that initiated the observation</description>
            <columns>
               <column>
                  <column_name>caom2.Proposal.id</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>collection-specific identifier for the proposal</description>
                  <utype>caom2:Proposal.id</utype>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Proposal.pi</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>proper name of the principal investigator</description>
                  <utype>caom2:Proposal.pi</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Proposal.project</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>common name of the project this proposal belongs to; typically used for larger or
                                 long-running projects that include mutliple proposals</description>
                  <utype>caom2:Proposal.project</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Proposal.title</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>title of the proposal</description>
                  <utype>caom2:Proposal.title</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Proposal.keywords</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>additional keywords that describe the science goals of the proposal; 
                                 keywords cannot contain the pipe (|) character - it is reserved for use in persistence
                                 systems (e.g. to store all keywords in a single column in a table)</description>
                  <utype>caom2:Proposal.keywords</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Proposal.reference</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>identifier for external resource with proposal details</description>
                  <utype>caom2:Proposal.reference</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Target</table_name>
            <table_type>table</table_type>
            <utype>caom2:Target</utype>
            <description>the target of an observation</description>
            <columns>
               <column>
                  <column_name>caom2.Target.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Target</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.name</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>proper name of the target</description>
                  <utype>caom2:Target.name</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.targetID</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>resolvable target identifier;
                                 the targetID URI should be of the form {scheme}:{id} so it can be resolved 
                                 (for example: naif:170100) </description>
                  <utype>caom2:Target.targetID</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.type_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>vocabulary term used in CAOM; this class defines constants for the CAOM
                          TargetType vocabulary (CHANGED from enumeration in CAOM-2.4)</description>
                  <utype>caom2:TargetType</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.type_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>vocabulary term used in CAOM; this class defines constants for the CAOM
                          TargetType vocabulary (CHANGED from enumeration in CAOM-2.4)</description>
                  <utype>caom2:TargetType</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.redshift</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>cosmological redshift of the target</description>
                  <utype>caom2:Target.redshift</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.standard</column_name>
                  <!--attribute of primitiveType ivoa:boolean-->
                  <datatype>INTEGER</datatype>
                  <description>indicates that the target is typically used as a standard (astrometric, photometric, etc)</description>
                  <utype>caom2:Target.standard</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.moving</column_name>
                  <!--attribute of primitiveType ivoa:boolean-->
                  <datatype>INTEGER</datatype>
                  <description>indicates that the target is a moving object; used for solar system objects 
                                 but not high proper motion stars</description>
                  <utype>caom2:Target.moving</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Target.keywords</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>additional keywords that describe the target; 
                                 keywords cannot contain the pipe (|) character - it is reserved for use in persistence
                                 systems (e.g. to store all keywords in a single column in a table)</description>
                  <utype>caom2:Target.keywords</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>TargetPosition</table_name>
            <table_type>table</table_type>
            <utype>caom2:TargetPosition</utype>
            <description>the intended position of the observation 
                           (not the position of the intended or actual target)</description>
            <columns>
               <column>
                  <column_name>caom2.TargetPosition.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for TargetPosition</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.TargetPosition.coordsys</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>the coordinate system of the coordinates</description>
                  <utype>caom2:TargetPosition.coordsys</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.TargetPosition.equinox</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>the equinox of the coordinates</description>
                  <utype>caom2:TargetPosition.equinox</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Requirements</table_name>
            <table_type>table</table_type>
            <utype>caom2:Requirements</utype>
            <description>the observational requirements specified by the proposal</description>
            <columns>
               <column>
                  <column_name>caom2.Requirements.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Requirements</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Requirements.flag_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>vocabulary term used in CAOM; this class defines constants for the CAOM
                          Status vocabulary (CHANGED from enumeration in CAOM-2.4)</description>
                  <utype>caom2:Status</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Requirements.flag_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>vocabulary term used in CAOM; this class defines constants for the CAOM
                          Status vocabulary (CHANGED from enumeration in CAOM-2.4)</description>
                  <utype>caom2:Status</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Provenance</table_name>
            <table_type>table</table_type>
            <utype>caom2:Provenance</utype>
            <description>description of how this data was produced</description>
            <columns>
               <column>
                  <column_name>caom2.Provenance.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Provenance</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.name</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>collection-specific common name of the process</description>
                  <utype>caom2:Provenance.name</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.reference</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>identifier for external resource with proposal details</description>
                  <utype>caom2:Provenance.reference</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.version</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>version of the software or process that produced the data</description>
                  <utype>caom2:Provenance.version</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.project</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>name of the project that produced the data; data produced in a uniform way are
                                 typically labelled with the same project name</description>
                  <utype>caom2:Provenance.project</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.producer</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>common name of the entity (person, institute, etc) responsible for producing the data</description>
                  <utype>caom2:Provenance.producer</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.runID</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>collection-specific identifier for the processing instance that produced the data;
                                 this identifier can typcially be traced in log files or logging systems</description>
                  <utype>caom2:Provenance.runID</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.lastExecuted</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>timestamp describing when this process last ran and produced data</description>
                  <utype>caom2:Provenance.lastExecuted</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.keywords</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>additional keywords that describe the processing; this may include both general
                                 descriptive words and those specific to this particular execution of the processing; 
                                 keywords cannot contain the pipe (|) character - it is reserved for use in persistence
                                 systems (e.g. to store all keywords in a single column in a table)</description>
                  <utype>caom2:Provenance.keywords</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Provenance.inputs</column_name>
                  <!--attribute of primitiveType ivoa:anyURI-->
                  <datatype>VARCHAR</datatype>
                  <description>local identifier for input planes; these are the actual inputs that went into the product</description>
                  <utype>caom2:Provenance.inputs</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Observable</table_name>
            <table_type>table</table_type>
            <utype>caom2:Observable</utype>
            <description>description of the sample (pixel) values</description>
            <columns>
               <column>
                  <column_name>caom2.Observable.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Observable</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observable.ucd_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>term from the UCD1+ vocabulary (NEW from enumeration in CAOM-2.5)</description>
                  <utype>caom2:UCDTerm</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observable.ucd_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>term from the UCD1+ vocabulary (NEW from enumeration in CAOM-2.5)</description>
                  <utype>caom2:UCDTerm</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observable.calibration_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Observable.calibration_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>DataQuality</table_name>
            <table_type>table</table_type>
            <utype>caom2:DataQuality</utype>
            <description>description of the data quality</description>
            <columns>
               <column>
                  <column_name>caom2.DataQuality.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for DataQuality</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.DataQuality.flag_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>vocabulary term used in CAOM; this class defines constants for the CAOM
                          Quality vocabulary (CHANGED from enumeration in CAOM-2.4)</description>
                  <utype>caom2:Quality</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.DataQuality.flag_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>vocabulary term used in CAOM; this class defines constants for the CAOM
                          Quality vocabulary (CHANGED from enumeration in CAOM-2.4)</description>
                  <utype>caom2:Quality</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Metrics</table_name>
            <table_type>table</table_type>
            <utype>caom2:Metrics</utype>
            <description>collection of measured quantities that describe the content of the data</description>
            <columns>
               <column>
                  <column_name>caom2.Metrics.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Metrics</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Metrics.sourceNumberDensity</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>number of sources detected per unit area</description>
                  <utype>caom2:Metrics.sourceNumberDensity</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Metrics.background</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>background level</description>
                  <utype>caom2:Metrics.background</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Metrics.backgroundStddev</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>standard deviation in the background level</description>
                  <utype>caom2:Metrics.backgroundStddev</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Metrics.fluxDensityLimit</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>flux density with a signal:noise ratio of 10</description>
                  <utype>caom2:Metrics.fluxDensityLimit</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Metrics.magLimit</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>magnitude with a signal:noise ratio of 10</description>
                  <utype>caom2:Metrics.magLimit</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Metrics.sampleSNR</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>signal:noise ratio for a representative subset of samples</description>
                  <utype>caom2:Metrics.sampleSNR</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Position</table_name>
            <table_type>table</table_type>
            <utype>caom2:Position</utype>
            <description>description of the position coverage and sampling of the data</description>
            <columns>
               <column>
                  <column_name>caom2.Position.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Position</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.dimension_naxis1</column_name>
                  <!--attribute from dtype-->
                  <datatype>INTEGER</datatype>
                  <description>dimension (number of pixels) for a two-dimensional axis</description>
                  <utype>caom2:types.Dimension2D</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.dimension_naxis2</column_name>
                  <!--attribute from dtype-->
                  <datatype>INTEGER</datatype>
                  <description>dimension (number of pixels) for a two-dimensional axis</description>
                  <utype>caom2:types.Dimension2D</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.maxRecoverableScale_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.maxRecoverableScale_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.resolution</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>mean spatial resolution (full-width-half-max) per pixel</description>
                  <utype>caom2:Position.resolution</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.resolutionBounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.resolutionBounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.sampleSize</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>median pixel size</description>
                  <utype>caom2:Position.sampleSize</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.calibration_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Position.calibration_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Energy</table_name>
            <table_type>table</table_type>
            <utype>caom2:Energy</utype>
            <description>description of the energy coverage and sampling of the data</description>
            <columns>
               <column>
                  <column_name>caom2.Energy.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Energy</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.bounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.bounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.energyBands</column_name>
                  <!--attribute of enumeration caom2:EnergyBand-->
                  <datatype>VARCHAR</datatype>
                  <description>standard name of the energy regime(s) included in the data</description>
                  <utype>caom2:Energy.energyBands</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.dimension</column_name>
                  <!--attribute of primitiveType ivoa:integer-->
                  <datatype>INTEGER</datatype>
                  <description>number of measurements (pixels) on the energy axis</description>
                  <utype>caom2:Energy.dimension</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.resolvingPower</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>mean spectral resolving power per pixel (relative resolution)</description>
                  <utype>caom2:Energy.resolvingPower</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.resolvingPowerBounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.resolvingPowerBounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.resolution</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>mean absolute spectral resolution per pixel (new in CAOM-2.5)</description>
                  <utype>caom2:Energy.resolution</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.resolutionBounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.resolutionBounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.sampleSize</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>mean pixel size</description>
                  <utype>caom2:Energy.sampleSize</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.bandpassName</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>telescope- and instrument-specific name for the energy band(s) included; multiple bands may be
                                 included if energies from all specified bands are included in the data (in the sense of union)</description>
                  <utype>caom2:Energy.bandpassName</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.restwav</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>rest energy of the target energy transition (name changed in CAOM-2.5)</description>
                  <utype>caom2:Energy.restwav</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.calibration_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.calibration_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.transition_species</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description/>
                  <utype>caom2:EnergyTransition</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Energy.transition_transition</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description/>
                  <utype>caom2:EnergyTransition</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Time</table_name>
            <table_type>table</table_type>
            <utype>caom2:Time</utype>
            <description>description of the time coverage and sampling of the data</description>
            <columns>
               <column>
                  <column_name>caom2.Time.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Time</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.bounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.bounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.calibration_namespace</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.calibration_term</column_name>
                  <!--attribute from dtype-->
                  <datatype>VARCHAR</datatype>
                  <description>This is a proposal for the creation of a IVOA calibration-status vocabulary.
                          This vocabulary can be created using optional terms in the ObsCore standard to describe
                          the calibration of each axis in the data separately. (NEW in CAOM-2.5)</description>
                  <utype>caom2:CalibrationStatus</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.dimension</column_name>
                  <!--attribute of primitiveType ivoa:integer-->
                  <datatype>INTEGER</datatype>
                  <description>number of discrete samples (pixels) on the time axis</description>
                  <utype>caom2:Time.dimension</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.resolution</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>median temporal resolution per pixel</description>
                  <utype>caom2:Time.resolution</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.resolutionBounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.resolutionBounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.sampleSize</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>median pixel size</description>
                  <utype>caom2:Time.sampleSize</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.exposure</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>mean exposure time per pixel</description>
                  <utype>caom2:Time.exposure</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.exposureBounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Time.exposureBounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Polarization</table_name>
            <table_type>table</table_type>
            <utype>caom2:Polarization</utype>
            <description>description of polarization measurements included in the data</description>
            <columns>
               <column>
                  <column_name>caom2.Polarization.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Polarization</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Polarization.states</column_name>
                  <!--attribute of enumeration caom2:PolarizationState-->
                  <datatype>VARCHAR</datatype>
                  <description>standard polarization states included (CHANGED cardinality in CAOM-2.5)</description>
                  <utype>caom2:Polarization.states</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Polarization.dimension</column_name>
                  <!--attribute of primitiveType ivoa:integer-->
                  <datatype>INTEGER</datatype>
                  <description>number of polarization states included</description>
                  <utype>caom2:Polarization.dimension</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>CustomAxis</table_name>
            <table_type>table</table_type>
            <utype>caom2:CustomAxis</utype>
            <description>description of a custom coordinate axis (new in CAOM-2.4)</description>
            <columns>
               <column>
                  <column_name>caom2.CustomAxis.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for CustomAxis</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.CustomAxis.ctype</column_name>
                  <!--attribute of primitiveType ivoa:string-->
                  <datatype>VARCHAR</datatype>
                  <description>coordinate type code</description>
                  <utype>caom2:CustomAxis.ctype</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.CustomAxis.bounds_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.CustomAxis.bounds_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.CustomAxis.dimension</column_name>
                  <!--attribute of primitiveType ivoa:integer-->
                  <datatype>INTEGER</datatype>
                  <description>number of discrete samples (pixels) along custom axis</description>
                  <utype>caom2:CustomAxis.dimension</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Visibility</table_name>
            <table_type>table</table_type>
            <utype>caom2:Visibility</utype>
            <description>description of a UV-plane for interferometry data (new in CAOM-2.5)</description>
            <columns>
               <column>
                  <column_name>caom2.Visibility.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Visibility</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Visibility.distance_lower</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Visibility.distance_upper</column_name>
                  <!--attribute from dtype-->
                  <datatype>DOUBLE</datatype>
                  <description>a set of numeric values defined by a lower and upper bound (bounds included: [a,b])</description>
                  <utype>caom2:types.Interval</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Visibility.distributionEccentricity</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>eccentricity of the distribtuion of ??? in [0,1]</description>
                  <utype>caom2:Visibility.distributionEccentricity</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Visibility.distributionFill</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description>fill-factor of the distribtuion of ??? in [0,1]</description>
                  <utype>caom2:Visibility.distributionFill</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Point</table_name>
            <table_type>table</table_type>
            <utype>caom2:types.Point</utype>
            <description>location on the sky</description>
            <columns>
               <column>
                  <column_name>caom2.Point.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Point</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Point.POLYGON_ID</column_name>
                  <datatype>BIGINT</datatype>
                  <description>foreign key column for caom2:types.Polygon composition of caom2:types.Point</description>
                  <utype>caom2:types.Polygon</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Point.cval1</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description/>
                  <utype>caom2:types.Point.cval1</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Point.cval2</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description/>
                  <utype>caom2:types.Point.cval2</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_Polygon.points</key_id>
                  <!--back reference to caom2:types.Point composition in caom2:types.Polygon -->
                  <target_table>Polygon</target_table>
                  <description>foreign key for caom2:types.Point composition in caom2:types.Polygon </description>
                  <utype>caom2:types.Polygon.points</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Point.POLYGON_ID</from_column>
                        <target_column>caom2.Polygon.ID</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>Shape</table_name>
            <table_type>table</table_type>
            <utype>caom2:types.Shape</utype>
            <description/>
            <columns>
               <column>
                  <column_name>caom2.Shape.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for Shape</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Shape.MULTISHAPE_ID</column_name>
                  <datatype>BIGINT</datatype>
                  <description>foreign key column for caom2:types.MultiShape composition of caom2:types.Shape</description>
                  <utype>caom2:types.MultiShape</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_MultiShape.shapes</key_id>
                  <!--back reference to caom2:types.Shape composition in caom2:types.MultiShape -->
                  <target_table>MultiShape</target_table>
                  <description>foreign key for caom2:types.Shape composition in caom2:types.MultiShape </description>
                  <utype>caom2:types.MultiShape.shapes</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Shape.MULTISHAPE_ID</from_column>
                        <target_column>caom2.MultiShape.ID</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>Circle</table_name>
            <table_type>table</table_type>
            <utype>caom2:types.Circle</utype>
            <description>a circular region on the sky</description>
            <columns>
               <column>
                  <column_name>caom2.Circle.ID</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>BIGINT</datatype>
                  <description>primary/join key for Circle</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.Circle.radius</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description/>
                  <utype>caom2:types.Circle.radius</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_types.Circle</key_id>
                  <target_table>Shape</target_table>
                  <description>join back to supertype caom2:types.Shape</description>
                  <utype>caom2:types.Circle</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Circle.ID</from_column>
                        <target_column>caom2.Shape.ID</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>MultiShape</table_name>
            <table_type>table</table_type>
            <utype>caom2:types.MultiShape</utype>
            <description>multiple simple shapess describing disconnected regions as a single value</description>
            <columns>
               <column>
                  <column_name>caom2.MultiShape.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for MultiShape</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys/>
         </table>
         <table>
            <table_name>Polygon</table_name>
            <table_type>table</table_type>
            <utype>caom2:types.Polygon</utype>
            <description>a simple polygon region on the sky defined a sequence of points connected by great-circle segments</description>
            <columns>
               <column>
                  <column_name>caom2.Polygon.ID</column_name>
                  <!--primary/join key for subtype-->
                  <datatype>BIGINT</datatype>
                  <description>primary/join key for Polygon</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_types.Polygon</key_id>
                  <target_table>Shape</target_table>
                  <description>join back to supertype caom2:types.Shape</description>
                  <utype>caom2:types.Polygon</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.Polygon.ID</from_column>
                        <target_column>caom2.Shape.ID</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
         <table>
            <table_name>IntervalM</table_name>
            <table_type>table</table_type>
            <utype>caom2:types.IntervalM</utype>
            <description>an interval that can appear in a composition</description>
            <columns>
               <column>
                  <column_name>caom2.IntervalM.ID</column_name>
                  <!--primary key (surrogate)-->
                  <datatype>BIGINT</datatype>
                  <description>primary key for IntervalM</description>
                  <indexed>true</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.IntervalM.ENERGY_ID</column_name>
                  <datatype>BIGINT</datatype>
                  <description>foreign key column for caom2:Energy composition of caom2:types.IntervalM</description>
                  <utype>caom2:Energy</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.IntervalM.TIME_ID</column_name>
                  <datatype>BIGINT</datatype>
                  <description>foreign key column for caom2:Time composition of caom2:types.IntervalM</description>
                  <utype>caom2:Time</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.IntervalM.CUSTOMAXIS_ID</column_name>
                  <datatype>BIGINT</datatype>
                  <description>foreign key column for caom2:CustomAxis composition of caom2:types.IntervalM</description>
                  <utype>caom2:CustomAxis</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.IntervalM.lower</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description/>
                  <utype>caom2:types.IntervalM.lower</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
               <column>
                  <column_name>caom2.IntervalM.upper</column_name>
                  <!--attribute of primitiveType ivoa:real-->
                  <datatype>DOUBLE</datatype>
                  <description/>
                  <utype>caom2:types.IntervalM.upper</utype>
                  <indexed>false</indexed>
                  <principal>false</principal>
                  <std>true</std>
               </column>
            </columns>
            <fkeys>
               <foreignKey>
                  <key_id>FK_Energy.samples</key_id>
                  <!--back reference to caom2:types.IntervalM composition in caom2:Energy -->
                  <target_table>Energy</target_table>
                  <description>foreign key for caom2:types.IntervalM composition in caom2:Energy </description>
                  <utype>caom2:Energy.samples</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.IntervalM.ENERGY_ID</from_column>
                        <target_column>caom2.Energy.ID</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
               <foreignKey>
                  <key_id>FK_Time.samples</key_id>
                  <!--back reference to caom2:types.IntervalM composition in caom2:Time -->
                  <target_table>Time</target_table>
                  <description>foreign key for caom2:types.IntervalM composition in caom2:Time </description>
                  <utype>caom2:Time.samples</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.IntervalM.TIME_ID</from_column>
                        <target_column>caom2.Time.ID</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
               <foreignKey>
                  <key_id>FK_CustomAxis.samples</key_id>
                  <!--back reference to caom2:types.IntervalM composition in caom2:CustomAxis -->
                  <target_table>CustomAxis</target_table>
                  <description>foreign key for caom2:types.IntervalM composition in caom2:CustomAxis </description>
                  <utype>caom2:CustomAxis.samples</utype>
                  <columns>
                     <fKColumn>
                        <from_column>caom2.IntervalM.CUSTOMAXIS_ID</from_column>
                        <target_column>caom2.CustomAxis.ID</target_column>
                     </fKColumn>
                  </columns>
               </foreignKey>
            </fkeys>
         </table>
      </tables>
   </schema>
</tap:tapschemaModel>
