A temporal database stores data relating to time instances. It offers temporal data types and stores information relating to past, present and future time. Temporal databases can be uni-temporal, bi-temporal or tri-temporal.
More specifically the temporal aspects usually include valid time, transaction time and/or decision time.
A uni-temporal database has one axis of time, either the validity range or the system time range.
A bi-temporal database has two axes of time:
A tri-temporal database has three axes of time:
This approach introduces additional complexities.
Temporal databases are in contrast to current databases (not to be confused with currently available databases), which store only facts which are believed to be true at the current time.
Temporal databases support managing and accessing temporal data by providing one or more of the following features: [1] [2]
With the development of SQL and its attendant use in real-life applications, database users realized that when they added date columns to key fields, some issues arose. For example, if a table has a primary key and some attributes, adding a date to the primary key to track historical changes can lead to creation of more rows than intended. Deletes must also be handled differently when rows are tracked in this way. In 1992, this issue was recognized but standard database theory was not yet up to resolving this issue, and neither was the then-newly formalized SQL-92 standard.
Richard Snodgrass proposed in 1992 that temporal extensions to SQL be developed by the temporal database community. In response to this proposal, a committee was formed to design extensions to the 1992 edition of the SQL standard (ANSI X3.135.-1992 and ISO/IEC 9075:1992); those extensions, known as TSQL2, were developed during 1993 by this committee. [3] In late 1993, Snodgrass presented this work to the group responsible for the American National Standard for Database Language SQL, ANSI Technical Committee X3H2 (now known as NCITS H2). The preliminary language specification appeared in the March 1994 ACM SIGMOD Record. Based on responses to that specification, changes were made to the language, and the definitive version of the TSQL2 Language Specification was published in September, 1994 [4]
An attempt was made to incorporate parts of TSQL2 into the new SQL standard SQL:1999, called SQL3. Parts of TSQL2 were included in a new substandard of SQL3, ISO/IEC 9075-7, called SQL/Temporal. [3] The TSQL2 approach was heavily criticized by Chris Date and Hugh Darwen. [5] The ISO project responsible for temporal support was canceled near the end of 2001.
As of December 2011, ISO/IEC 9075, Database Language SQL:2011 Part 2: SQL/Foundation included clauses in table definitions to define "application-time period tables" (valid time tables), "system-versioned tables" (transaction time tables) and "system-versioned application-time period tables" (bitemporal tables). A substantive difference between the TSQL2 proposal and what was adopted in SQL:2011 is that there are no hidden columns in the SQL:2011 treatment, nor does it have a new data type for intervals; instead two columns with datestamps (DS) or date-timestamps (DTS) can be bound together using a PERIOD FOR
declaration. Another difference is replacement of the controversial (prefix) statement modifiers from TSQL2 with a set of temporal predicates. [1]
Other features of SQL:2011 standard related to temporal databases are automatic time period splitting, temporal primary keys, temporal referential integrity, temporal predicates with Allen's interval algebra and time-sliced and sequenced queries.
For illustration, consider the following short biography of a fictional man, John Doe:
To store the life of John Doe in a current (non-temporal) database we use a table person (name, address)
. (In order to simplify, name
is defined as the primary key of person
.)
John's father officially reported his birth on 1975-04-04. On this date a Smallville official inserted the following entry in the database: Person(John Doe, Smallville)
. Note that the date itself is not stored in the database.
After graduation, John moves out, but forgets to register his new address. John's entry in the database is not changed until 1994-12-27, when he finally reports it. A Bigtown official updates his address in the database. The person
table now contains Person(John Doe, Bigtown)
. Note that the information of John living in Smallville has been overwritten, so it is no longer possible to retrieve that information from the database. An official accessing the database on 1994-12-28, would be told that John lives in Bigtown. More technically: if a database administrator ran the query SELECTADDRESSFROMPERSONWHERENAME='John Doe'
on 1994-12-26, the result would be Smallville
. Running the same query 2 days later would result in Bigtown
.
Until his death, the database would state that he lived in Bigtown. On 2001-04-01, the coroner deletes the John Doe entry from the database. After this, running the above query would return no result at all.
Date | Real world event | Database action | What the database shows |
---|---|---|---|
1975-04-03 | John is born | Nothing | There is no person called John Doe |
1975-04-04 | John's father officially reports John's birth | Inserted:Person(John Doe, Smallville) | John Doe lives in Smallville |
1994-08-26 | After graduation, John moves to Bigtown, but forgets to register his new address | Nothing | John Doe lives in Smallville |
1994-12-26 | Nothing | Nothing | John Doe lives in Smallville |
1994-12-27 | John registers his new address | Updated:Person(John Doe, Bigtown) | John Doe lives in Bigtown |
2001-04-01 | John dies | Deleted:Person(John Doe) | There is no person called John Doe |
Valid time is the time for which a fact is true in the real world. A valid time period may be in the past, span the current time, or occur in the future.
For the example above, to record valid time, the person
table has two fields added, valid_from
and valid_to
. These specify the period when a person's address is valid in the real world. On 1975-04-04, John's father registered his son's birth. An official then inserts a new entry into the database stating that John lives in Smallville from April 3. Note that although the data was inserted on the fourth, the database states that the information is valid since the third. The official does not yet know if or when John will move to another place, so the valid_to
field is set to infinity (∞). The entry in the database is:
Name | City | Valid from | Valid to |
---|---|---|---|
John Doe | Smallville | 1975-04-03 | ∞ |
On 1994-12-27, John reports his new address in Bigtown where he has been living since 1994-08-26. A new database entry is made to record this fact:
Name | City | Valid from | Valid to |
---|---|---|---|
John Doe | Bigtown | 1994-08-26 | ∞ |
The original entry Person (John Doe, Smallville, 1975-04-03, ∞)
is not deleted, but has the valid_to
attribute updated to reflect that it is now known that John stopped living in Smallville on 1994-08-26. The database now contains two entries for John Doe:
Name | City | Valid from | Valid to |
---|---|---|---|
John Doe | Smallville | 1975-04-03 | 1994-08-26 |
John Doe | Bigtown | 1994-08-26 | ∞ |
When John dies his current entry in the database is updated stating that John does not live in Bigtown any longer. The database now looks like this:
Name | City | Valid from | Valid to |
---|---|---|---|
John Doe | Smallville | 1975-04-03 | 1994-08-26 |
John Doe | Bigtown | 1994-08-26 | 2001-04-01 |
Transaction time records the time period during which a database entry is accepted as correct. This enables queries that show the state of the database at a given time. Transaction time periods can only occur in the past or up to the current time. In a transaction time table, records are never deleted. Only new records can be inserted, and existing ones updated by setting their transaction end time to show that they are no longer current.
To enable transaction time in the example above, two more fields are added to the Person table: transaction_from
and transaction_to
. Here, transaction_from
is the time a transaction was made, and transaction_to
is the time that the transaction was superseded (which may be infinity if it has not yet been superseded). This makes the table into a bitemporal table.
What happens if the person's address as stored in the database is incorrect? Suppose an official accidentally entered the wrong address or date? Or, suppose the person lied about their address for some reason. Upon discovery of the error, the officials update the database to correct the information recorded.
For example, from 1995-06-01 to 2000-09-03, John Doe moved to Beachy. But to avoid paying Beachy's exorbitant residence tax, he never reported it to the authorities. Later during a tax investigation, it is discovered on 2-Feb-2001 that he was in fact in Beachy during those dates. To record this fact, the existing entry about John living in Bigtown must be split into two separate records, and a new record inserted recording his residence in Beachy. The database would then appear as follows:
Name | City | Valid from | Valid to |
---|---|---|---|
John Doe | Smallville | 1975-04-03 | 1994-08-26 |
John Doe | Bigtown | 1994-08-26 | 1995-06-01 |
John Doe | Beachy | 1995-06-01 | 2000-09-03 |
John Doe | Bigtown | 2000-09-03 | 2001-04-01 |
However, this leaves no record that the database ever claimed that he lived in Bigtown during 1995-06-01 to 2000-09-03.This might be important to know for auditing reasons, or to use as evidence in the official's tax investigation. Transaction time allows capturing this changing knowledge in the database, since entries are never directly modified or deleted. Instead, each entry records when it was entered and when it was superseded (or logically deleted). The database contents then look like this:
Name | City | Valid from | Valid to | Entered | Superseded |
---|---|---|---|---|---|
John Doe | Smallville | 1975-04-03 | ∞ | 1975-04-04 | 1994-12-27 |
John Doe | Smallville | 1975-04-03 | 1994-08-26 | 1994-12-27 | ∞ |
John Doe | Bigtown | 1994-08-26 | ∞ | 1994-12-27 | 2001-02-02 |
John Doe | Bigtown | 1994-08-26 | 1995-06-01 | 2001-02-02 | ∞ |
John Doe | Beachy | 1995-06-01 | 2000-09-03 | 2001-02-02 | ∞ |
John Doe | Bigtown | 2000-09-03 | ∞ | 2001-02-02 | 2001-04-01 |
John Doe | Bigtown | 2000-09-03 | 2001-04-01 | 2001-04-01 | ∞ |
The database records not only what happened in the real world, but also what was officially recorded at different times.
Decision time is an alternative to the transaction time period for recording the time at which a database entry may be accepted as correct. This enables queries that show the officially recognized facts at a given time, even if there was a delay in committing those facts to the database. Support for decision time preserves the entire history and prevents the loss of information during updates. [6]
Decision time periods can only occur in the past or up to the transaction time. As in a transaction time table, records are never deleted. Only new records can be inserted, and existing ones updated by setting their decision end time to show that they are no longer current.
To enable decision time, two more fields are added to a database table: decision_from
and decision_to
. Here, decision_from
is the time a decision was made, and decision_to
is the time that the decision was superseded (which may be infinity if it has not yet been superseded). When combined with transaction time, this makes the table into a tritemporal table. The following is a list of real events that occurred between the 1964 and 1976 United States presidential elections:
Date | Decision maker | Real world event |
---|---|---|
1964-11-03 | Electoral College | Election of 1964 |
1968-11-05 | Electoral College | Election of 1968 |
1972-11-07 | Electoral College | Election of 1972 |
1973-10-10 | Spiro Agnew | Agnew resigns |
1973-10-12 | Richard Nixon | Nixon nominates Ford |
1973-12-06 | Congress | Congress confirms Ford |
1974-08-09 | Richard Nixon | Nixon resigns |
1974-08-20 | Gerald Ford | Ford nominates Rockefeller |
1974-12-19 | Congress | Congress confirms Rockefeller |
1976-11-02 | Electoral College | Election of 1976 |
In this example, a constant 7-day delay is assumed between the decision time and the transaction time when the data is committed to the database. Given those conditions, the database would have contained the following information after the election in 1976:
Valid | Decision | Transaction | |||||
---|---|---|---|---|---|---|---|
President | Vice | From | To | From | To | From | To |
Johnson | Humphrey | 1965-01-20 | 1969-01-20 | 1964-11-03 | ∞ | 1964-11-10 | ∞ |
Nixon | Agnew | 1969-01-20 | 1973-01-20 | 1968-11-05 | ∞ | 1968-11-12 | ∞ |
Nixon | Agnew | 1973-01-20 | 1977-01-20 | 1972-11-07 | ∞ | 1972-11-14 | 1973-10-17 |
Nixon | Agnew | 1973-01-20 | 1977-01-20 | 1972-11-07 | 1973-10-10 | 1973-10-17 | ∞ |
Nixon | Agnew | 1973-01-20 | 1973-10-10 | 1973-10-10 | ∞ | 1973-10-17 | ∞ |
Nixon | (Vacant) | 1973-10-10 | 1977-01-20 | 1973-10-10 | ∞ | 1973-10-17 | 1973-12-13 |
Nixon | Ford | ∞ | 1977-01-20 | 1973-10-12 | ∞ | 1973-10-19 | 1973-12-13 |
Nixon | (Vacant) | 1973-10-10 | 1977-01-20 | 1973-10-10 | 1973-12-06 | 1973-12-13 | ∞ |
Nixon | (Vacant) | 1973-10-10 | 1973-12-06 | 1973-12-06 | ∞ | 1973-12-13 | ∞ |
Nixon | Ford | ∞ | 1977-01-20 | 1973-10-12 | 1973-12-06 | 1973-12-13 | ∞ |
Nixon | Ford | 1973-12-06 | 1977-01-20 | 1973-12-06 | ∞ | 1973-12-13 | 1974-08-15 |
Nixon | Ford | 1973-12-06 | 1977-01-20 | 1973-12-06 | 1974-08-08 | 1974-08-15 | ∞ |
Nixon | Ford | 1973-12-06 | 1974-08-09 | 1974-10-08 | ∞ | 1974-08-15 | ∞ |
Ford | (Vacant) | 1974-08-09 | 1977-01-20 | 1974-10-08 | ∞ | 1974-08-15 | 1974-12-26 |
Ford | Rockefeller | ∞ | 1977-01-20 | 1974-10-20 | ∞ | 1974-08-27 | 1974-12-26 |
Ford | (Vacant) | 1974-08-09 | 1977-01-20 | 1974-10-08 | 1974-12-19 | 1974-12-26 | ∞ |
Ford | (Vacant) | 1974-08-09 | 1974-12-19 | 1974-12-19 | ∞ | 1974-12-26 | ∞ |
Ford | Rockefeller | ∞ | 1977-01-20 | 1974-08-20 | 1974-12-19 | 1974-12-26 | ∞ |
Ford | Rockefeller | 1974-12-19 | 1977-01-20 | 1974-12-19 | ∞ | 1974-12-26 | ∞ |
Carter | Mondale | 1977-01-20 | 1981-01-20 | 1976-11-02 | ∞ | 1976-11-09 | ∞ |
Given the 7-day delayed table above, the question "who was president and vice president for the valid time of 1977-01-01" (which given the 7-day delay could provide data for 1976-12-25) would be:
A bitemporal model contains both valid and transaction time. This provides both historical and rollback information. Historical information (e.g.: "Where did John live in 1992?") is provided by the valid time. Rollback (e.g.: "In 1992, where did the database believe John lived?") is provided by the transaction time. The answers to these example questions may not be the same – the database may have been altered since 1992, causing the queries to produce different results.
The valid time and transaction time do not have to be the same for a single fact. For example, consider a temporal database storing data about the 18th century. The valid time of these facts is somewhere between 1701 and 1800. The transaction time would show when the facts were inserted into the database (for example 1998-01-21).
A challenging issue is the support of temporal queries in a transaction time database under evolving schema. In order to achieve perfect archival quality it is of key importance to store the data under the schema version under which they first appeared. However, even the most simple temporal query rewriting the history of an attribute value would be required to be manually rewritten under each of the schema versions, potentially hundreds as in the case of MediaWiki. [7] This process would be particularly taxing for users. A proposed solution is to provide automatic query rewriting, [8] [9] although this is not part of SQL or similar standards.
Approaches to minimize the complexities of schema evolution are to:
The following implementations provide temporal features in a relational database management system (RDBMS).
Non-relational, NoSQL database management systems that provide temporal features including the following:
Temporal databases were one of the earliest forms of data version control, and influenced the development of modern data versioning systems. [19]
Slowly changing dimensions can be used to model temporal relations.
In computing, a database is an organized collection of data or a type of data store based on the use of a database management system (DBMS), the software that interacts with end users, applications, and the database itself to capture and analyze the data. The DBMS additionally encompasses the core facilities provided to administer the database. The sum total of the database, the DBMS and the associated applications can be referred to as a database system. Often the term "database" is also used loosely to refer to any of the DBMS, the database system or an application associated with the database.
PostgreSQL also known as Postgres, is a free and open-source relational database management system (RDBMS) emphasizing extensibility and SQL compliance. PostgreSQL features transactions with atomicity, consistency, isolation, durability (ACID) properties, automatically updatable views, materialized views, triggers, foreign keys, and stored procedures. It is supported on all major operating systems, including Linux, FreeBSD, OpenBSD, macOS, and Windows, and handles a range of workloads from single machines to data warehouses or web services with many concurrent users.
A relational database (RDB) is a database based on the relational model of data, as proposed by E. F. Codd in 1970. A database management system used to maintain relational databases is a relational database management system (RDBMS). Many relational database systems are equipped with the option of using SQL for querying and updating the database.
Structured Query Language (SQL) is a domain-specific language used to manage data, especially in a relational database management system (RDBMS). It is particularly useful in handling structured data, i.e., data incorporating relations among entities and variables.
In the context of SQL, data definition or data description language (DDL) is a syntax for creating and modifying database objects such as tables, indices, and users. DDL statements are similar to a computer programming language for defining data structures, especially database schemas. Common examples of DDL statements include CREATE
, ALTER
, and DROP
. If you see a .ddl file, that means the file contains a statement to create a table. Oracle SQL Developer contains the ability to export from an ERD generated with Data Modeler to either a .sql file or a .ddl file.
A surrogate key in a database is a unique identifier for either an entity in the modeled world or an object in the database. The surrogate key is not derived from application data, unlike a natural key.
An SQL INSERT statement adds one or more records to any single table in a relational database.
In temporal databases, valid-time is the time period when an event happened or something was true in the real world, or more formally when a fact was valid in the modeled reality.
In temporal databases, transaction time is the time when some data has been loaded into a database. The time when a transaction is valid can be called the transaction time-period. It is a technical timeline controlled by a integration layer. More formally, it is the point-in-time during which a fact stored in the database is considered to be true.
A database trigger is procedural code that is automatically executed in response to certain events on a particular table or view in a database. The trigger is mostly used for maintaining the integrity of the information on the database. For example, when a new record is added to the employees table, new records should also be created in the tables of the taxes, vacations and salaries. Triggers can also be used to log historical data, for example to keep track of employees' previous salaries.
The following tables compare general and technical information for a number of relational database management systems. Please see the individual products' articles for further information. Unless otherwise specified in footnotes, comparisons are based on the stable versions without any add-ons, extensions or external programs.
SQL-92 was the third revision of the SQL database query language. Unlike SQL-89, it was a major revision of the standard. Aside from a few minor incompatibilities, the SQL-89 standard is forward-compatible with SQL-92.
Sixth normal form (6NF) is a normal form used in relational database normalization which extends the relational algebra and generalizes relational operators to support interval data, which can be useful in temporal databases.
In computer science, schema versioning and schema evolution, deal with the need to retain current data and software system functionality in the face of changing database structure. The problem is not limited to the modification of the schema. It, in fact, affects the data stored under the given schema and the queries posed on that schema.
A hierarchical query is a type of SQL query that handles hierarchical model data. They are special cases of more general recursive fixpoint queries, which compute transitive closures.
Richard Thomas Snodgrass is an American computer scientist and writer and is professor emeritus at the University of Arizona. He is best known for his work on temporal databases, query language design, query optimization and evaluation, storage structures, database design, and ergalics.
Bitemporal modeling is a specific case of temporal database information modeling technique designed to handle historical data along two different timelines. This makes it possible to rewind the information to "as it actually was" in combination with "as it was recorded" at some point in time. In order to be able to do so, information cannot be discarded even if it is erroneous. Within, for example, financial reporting it is often desirable to be able to recreate an old report both as it actually looked at the time of creation and as it should have looked given corrections made to the data after its creation.
SQL:2011 or ISO/IEC 9075:2011 is the seventh revision of the ISO (1987) and ANSI (1986) standard for the SQL database query language. It was formally adopted in December 2011. The standard consists of 9 parts which are described in detail in SQL. The next version is SQL:2016.
The following is provided as an overview of and topical guide to databases:
In temporal databases, decision time is the time when a decision was made about a fact stored in a database. It is used to keep a history of decisions about valid times.