Действительно ли циклические ссылки приемлемы в базе данных?

Обновлено для Swift 4 Воспроизведение из основного комплекта - только для iOS 11

import AVFoundation

var player: AVAudioPlayer?

Следующий код загружает звуковой файл и воспроизводит его, возвращая при необходимости ошибку.

guard let url = Bundle.main.url(forResource: "test", withExtension: "m4a") else { return }

    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)

    guard let player = player else { return }

    player.play()

    } catch let error {
        // Prints a readable error
        print(error.localizedDescription)
    }
26
задан stefanB 17 June 2009 в 13:22
поделиться

7 ответов

Записи, указывающие на другие записи, полезны в базе данных. Иногда эти записи образуют цикл. Это все еще может быть полезно. Единственное, что действительно раздражает на практике, - это избегать нарушения ограничений.

Например, если у вас есть таблица пользователей и транзакций, у пользователя может быть указатель на свою последнюю транзакцию. Сначала необходимо вставить транзакцию, а затем обновить last_transaction_id до правильного значения. Пока существуют обе эти записи, вы не можете их стереть, потому что user.last_transaction_id указывает на transaction.id , а transaction.user_id указывает на пользователя .id . Это означает, что пользователь без транзакций имеет нулевой last_transaction_id . Это также означает, что вы должны обнулить это поле, прежде чем сможете удалить транзакцию.

Управление этими ограничениями внешнего ключа - это боль, но, безусловно, возможно. Могут возникнуть проблемы, если позже вы добавите в базу данных ограничения, которые вводят новые циклические зависимости. В этой ситуации нужно быть осторожным. Однако, пока одна из записей в цикле имеет поле внешнего ключа, допускающее значение NULL, цикл может быть прерван, а записи могут быть удалены. Обновление обычно не является проблемой, если вы вставляете записи в правильном порядке.

если одна из записей в цикле имеет поле внешнего ключа, допускающее значение NULL, цикл может быть прерван, а записи могут быть удалены. Обновление обычно не является проблемой, если вы вставляете записи в правильном порядке.

если одна из записей в цикле имеет поле внешнего ключа, допускающее значение NULL, цикл может быть прерван, а записи могут быть удалены. Обновление обычно не является проблемой, если вы вставляете записи в правильном порядке.

14
ответ дан 28 November 2019 в 07:08
поделиться

Это технически возможно, но это может вызвать всевозможные проблемы при удалении записей, поскольку создает проблемы с курицей и яйцом. Эти проблемы часто требуют радикальных действий, таких как удаление FK вручную и удаление проблемных элементов для решения.

Если у вас есть такие отношения, как:

create table foo_master (
       foo_master_id int not null primary key
      ,current_foo_id int
)


create table foo_detail (
       foo_detail_id int not null primary key
       foo_master_id int not null
)

alter table foo_master
  add constraint fk_foo_current_detail
      foreign key (current_foo_id)
      references foo_detail

alter table foo_detail
  add constraint fk_foo_master
      foreign key (foo_master_id)
      references foo_master

Тогда удаление записи может вызвать такую ​​проблему из-за циркуляра зависимости.

Лучшая схема для этого выглядит так:

create table foo_master (
       foo_master_id int not null primary key
)


create table foo_detail (
       foo_detail_id int not null primary key
       foo_master_id int not null
       is_current char (1)
)

alter table foo_detail
  add constraint fk_foo_master
      foreign key (foo_master_id)
      references foo_master

Это означает, что связь нециклическая и «текущая» запись foo_detail все еще может быть идентифицирована.

3
ответ дан 28 November 2019 в 07:08
поделиться

Одно из последних дополнений к синтаксису иерархических запросов Oracle - ключевое слово NOCYCLE - было сделано специально для этой цели - для работы с циклическими ссылками в данных. Я не вижу в этом ничего плохого, и раньше мне приходилось иметь дело с такой моделью. Это не так уж сложно, особенно в Oracle, который поддерживает отложенные ограничения.

4
ответ дан 28 November 2019 в 07:08
поделиться

Circular references should be avoided like the plague. It is possible to set up two way relationships, or even relationships to yourself (if you were a table that is), but a circular dependency is just asking for trouble.

1
ответ дан 28 November 2019 в 07:08
поделиться

Я видел циклические ссылки, сделанные из соображений производительности. Однако это выглядит некрасиво, и производительность может быть незначительной.

Пример: на некоторых досках объявлений (я думаю, что это делает phpBB) есть lastpostid в таблице категорий, который является ярлыком к последнему сообщению в цепочке.

Это создает круг, где последнее сообщение имеет FK для таблицы категорий, а таблица категорий имеет FK обратно к последнему сообщению.

Как я уже сказал, мне это не очень нравится, но я видел, как это было .

1
ответ дан 28 November 2019 в 07:08
поделиться

редко я сталкиваюсь с необходимыми отношениями 1: 1, которые накладывают циклические отношения

, обратите внимание, что поля внешнего ключа в таких отношениях должны допускать значение NULL, иначе вы никогда не сможете удалить строки из таблиц

0
ответ дан 28 November 2019 в 07:08
поделиться

Думаю, это не проблема, если вы используете базу данных только для записи. Если вы планируете использовать часть RUD в CRUD, вы

0
ответ дан 28 November 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: