The primary value element

Primary values are closely related to primary keys, but have an informal linguistic meaning. An example is city name. In general the name of a city identifies a city exactly. This however is not strictly true. For example the city "Springfield" is ambiguous while "Chicago" is not. The following example captures this for geo:

    <table id="City" lex="city,cities,town,towns">
        <column id="name" type="text" lex="name,names,named,called"/>
        <column id="state" type="text" lex="where,located in"/>
        <column id="population" type="int" lex="population,populations,..."/>

        <primary_key key="name,state"/>
        <primary_value key="name"/>
    </table>
    

The DTD of primary values is almost exactly the same as that for primary keys but only one attribute can be a primary value:

<!ATTLIST primary_value
          key CDATA #REQUIRED
          description CDATA #IMPLIED>

key is the identifier of a single column in the table.

It you would like to make a sets of columns (e.g. first and last names) together form primary values then create a virtual attribute of the pair (e.g. name) and make that a primary value.

There are cases where you may be tempted to use primary values to let users reference records directly by their value, but there are many records of that value. For example you might put primary value around the column type a table Worker so that you can ask 'give me the contractors'. In this case you could put the property +value-stands-for-table on that column and not use the primary value element.