Circular reference
A circular reference is a series of references where the last object references the first, resulting in a closed loop.
In language
A circular reference is not to be confused with the logical fallacy of a circular argument. Although a circular reference will often be unhelpful and reveal no information, such as two entries in a book index referring to each other, it is not necessarily so that a circular reference is of no use. Dictionaries, for instance, must always ultimately be a circular reference since all words in a dictionary are defined in terms of other words, but a dictionary nevertheless remains a useful reference. Sentences containing circular referents can still be meaningful;
- Her brother gave her a kitten; his sister thanked him for it.
is circular but not without meaning. Indeed, it can be argued that self-reference is a necessary consequence of Aristotle's Law of non-contradiction, a fundamental philosophical axiom. In this view, without self-reference, logic and mathematics become impossible, or at least, lack usefulness.[1][2]
In business
Sometimes, improperly planned business support will result in a circular reference. For example:
Alice needs to return her washing machine – it's defective and she needs it working. She is instructed by Bob of customer service to report to Carol of Returns and Exchanges for the requested service. Carol, however, tells Alice to report to David. David tells Alice to talk to Bob.
The entire set of references is now worthless because none of them can satisfy Alice's request; Alice has been given the run-around, every referral leads to Alice being told to refer to someone else and ultimately she is referred back to the person she approached first.
In computer programming
Circular references can appear in computer programming when one piece of code requires the result from another, but that code needs the result from the first. For example:
Function A will show the time the sun last set based on the current date. Function B will calculate the date based on the number of times the moon has orbited the earth since the last time Function B was called. So, Function B asks Function C just how many times that is. Function C doesn't know, but can figure it out by calling Function A to get the time the sun last set.
The entire set of functions is now worthless because none of them can return any useful information whatsoever. This leads to what is technically known as a livelock. It also appears in spreadsheets when two cells require each other's result. For example, if the value in Cell A1 is to be obtained by adding 5 to the value in Cell B1, and the value in Cell B1 is to be obtained by adding 3 to the value in Cell A1, no values can be computed. (Even if the specifications are A1:=B1+5 and B1:=A1-5, there is still a circular reference. It doesn't help that, for instance, A1=3 and B1=-2 would satisfy both formulas, as there are infinitely many other possible values of A1 and B1 that can satisfy both instances.)
A circular reference represents a big problem in computing. A deadlock occurs when two or more processes are each waiting for another to release a resource. Most relational databases such as Oracle and SQL Server do not allow circular referencing because there is always a problem when deleting a row from a table having dependencies to another row from another table (foreign key) which refers to the row being deleted. From the technical documentation at Microsoft: The FOREIGN KEY constraints cannot be used to create a self-referencing or circular FOREIGN KEY constraint.[3]
For Oracle and PostgreSQL the problem with updating a circular reference can be solved by defining the corresponding foreign keys as deferrable (See CREATE TABLE for PostgreSQL and DEFERRABLE Constraint Examples for Oracle). In that case the constraint is checked at the end of the transaction not at the time the DDL statement is executed. To update a circular reference two statements can be issued in a single transaction that will satisfy both references once the transaction is committed.
Only inner joins are supported and are specified by a comparison of columns from different tables. Circular joins are not supported. A circular join is a SQL query that links three or more tables together into a circuit.[4] Oracle uses the term Cyclic to designate a circular reference.[5]
A distinction should be made with processes containing a circular reference between those that are incomputable and those that are an iterative calculation with a final output. The latter may fail in spreadsheets not equipped to handle them but are nevertheless still logically valid.[2]
Circular references in spreadsheets
Circular reference in worksheets can be a very useful technique for solving implicit equations such as the Colebrook equation and many others, which might otherwise require tedious Newton-Raphson algorithms in VBA or use of macros.[6]
See also
- MS Fnd in a Lbry
- Nested function
- Halting problem
- Catch-22 (logic)
- There's a hole in the bucket
- Regress argument
- Pseudohistory
- Chicken or the egg
References
- ↑ Terry A. Osborn, The future of foreign language education in the United States, pp.31-33, Greenwood Publishing Group, 2002 ISBN 0-89789-719-6.
- ↑ 2.0 2.1 Robert Fiengo, Robert May, Indices and identity, pp.59-62, MIT Press, 1994 ISBN 0-262-56076-3.
- ↑ "Microsoft TechNet - SQL Server CREATE TABLE"..
- ↑ "Microsoft Developer Network - SQL Syntax"..
- ↑ "Oracle Documentation - SQL Error Messages"..
- ↑ "Solve Implicit Equations Inside Your Worksheet By Anilkumar M, Dr Sreenivasan E and Dr Raghunathan K"..