Записи, которые указывают на другие записи, полезны в базе данных. Иногда эти записи образуют цикл. Это может быть полезно. Единственное реальное раздражение на практике заключается в том, чтобы избежать нарушения ограничений.
Например, если у вас есть таблица пользователя и транзакции, пользователь может иметь указатель на свою последнюю транзакцию. Сначала нужно вставить транзакцию, а затем обновить user.last_transaction_id
до правильного значения. В то время как обе эти записи существуют, вы не можете их стереть, потому что transaction.id
точки transaction.user_id
и user.id
точки last_transaction_id
. Это означает, что у пользователя без транзакций есть нуль . Это также означает, что вы должны удалить это поле, прежде чем сможете удалить транзакцию.CREATE TABLE city ( city VARCHAR(32), state VARCHAR(32), PRIMARY KEY (city), FOREIGN KEY (state) REFERENCES state (state) ); CREATE TABLE state ( state VARCHAR(32), captial_city VARCHAR(32), PRIMARY KEY (state), FOREIGN KEY (captial_city) REFERENCES city (city) );
Управление этими ограничениями внешнего ключа - это боль, но это, безусловно, возможно. Могут возникнуть проблемы, возникающие при добавлении ограничений в базу данных позже, которые вводят новые круговые зависимости. Вы должны быть осторожны в этой ситуации. Однако, если одна из записей в цикле имеет поле с нулевым внешним ключом, цикл может быть нарушен, и записи могут быть удалены. Обновления обычно не являются проблемой, если вы вставляете записи в правильном порядке.