Какие алгоритмы, как известно, выполняют задачу по обновлению базы данных путем вставки, обновления и удаления строк при наличии ограничений базы данных?Алгоритмы для обновления реляционных данных
В частности, скажем, что перед образами строк, подлежащих удалению, после изображений вставленных строк и обоими изображениями обновляемых строк находятся в памяти. Строки могут быть для нескольких таблиц. Точная последовательность обновлений либо неизвестна, либо не была сохранена - известны только предыдущие изображения и изображения после того, как база данных должна быть сделана для отражения.
База данных содержит первичный ключ, внешний ключ и уникальные ограничения индекса. Проблема состоит в том, чтобы найти последовательность команд, чтобы обновить базу данных. Для простоты я хочу указать, что первичный ключ строки никогда не будет изменен.
Система базы данных не поддерживает проверку отложенных ограничений. (Это решение тривиально для таких баз данных). Я также должен сделать правило, что столбцы первичных ключей не могут быть обновлены после вставки, и не разрешается удалять строку и повторно вставлять ее с тем же самым первичным ключом, хотя некоторые алгоритмы могут в противном случае найти это удобно. (Это необходимо для наиболее распространенных сценариев, где все первичные ключи автоматически сгенерирован системой базы данных.)
Какие алгоритмы:
- Если предположить, что ограничения внешнего ключа должно быть приведено в исполнение в любое время, но уникальные индексы не являются используемый.
- Предполагая, что ограничения внешнего ключа и уникальные ограничения индекса должны быть соблюдены в любое время.
Я прошу, потому что я думаю, что # 1 может быть значительно проще.
EDIT: Цель состоит в том, чтобы решить проблему отсутствия проверки отложенных ограничений в общем (или почти общем смысле) пути. Я полагаю, что высококачественные пакеты ORM должны это сделать. Я хочу объяснить алгоритмы, предоставленные вами здесь или извне в академической статье и т. Д. Я не буду рассматривать указатель на программный пакет или исходный код на этот вопрос.
НАИВНЫЙ АЛГОРИТМ:
петли через таблицы и для каждой строки, которая добавляется, изменение или удаление генерации одного INSERT, UPDATE или DELETE заявление, соответственно, для каждого из них. Прокрутите созданные сгенерированные операторы и примените к базе данных. Если заявление не применяется, продолжайте работу с другими операциями. Повторите утверждения, которые потерпели неудачу. Продолжайте повторять, пока не будет больше сбоев, или пропуск успешно не выполняет никаких заявлений. Если утверждения остаются, попробуйте временную настройку данных в проблемных столбцах, чтобы попытаться добиться успеха.
Это уродливый алгоритм грубой силы и выяснение части «временной настройки» - это самостоятельная задача. Итак, мне нужен улучшенный и полный алгоритм.
EDIT2:
RBarryYoung сообщений ответ, который получает близко (но не сигары), чтобы полностью решить сценарий № 1 при решении наиболее распространенных сценария # 2 проблемы одновременно. Ниже приведен пример шаблона обновления сценария № 1. Я видел очень часто в приложениях, но еще не достиг решения.DELETE/UPDATE-INSERT точно соответствует времени в сценарии №1, но трюк заключается в том, чтобы выяснить, когда отклоняться от него. Я также подозреваю, что отклонение от него увеличивает количество УНИКАЛЬНЫХ проблем по сценарию № 2, возможно, увеличивая мой интерес к решению сценария №2.
Обратите внимание, что нет никаких циклов и никаких первичных ключей не изменено. Однако внешний ключ для родителя изменяется.
CREATE TABLE A
(
AId INT NOT NULL PRIMARY KEY
)
CREATE TABLE B
(
BId INT NOT NULL PRIMARY KEY,
AId INT NOT NULL FOREIGN KEY REFERENCES A (AId)
)
CREATE TABLE C
(
CId INT NOT NULL PRIMARY KEY,
AId INT NOT NULL FOREIGN KEY REFERENCES A (AId),
BId INT NOT NULL FOREIGN KEY REFERENCES B (BId)
)
Перед Изображения:
A (1)
B (1,1)
C (1,1,1)
После того, как изображения:
A (1)
B (2,1) [To be deleted: (1,1)]
C (1,1,2)
сортировки: A, B, C
Первая команда DELETE B (1,1) который терпит неудачу из-за C (1,1,1).
Обратите внимание, что если третий столбец в C допускает NULL (которого в этом случае нет), чистое решение может включать в себя NULLing его в раннем проходе, поскольку это позволило бы данному алгоритму нормально работать и иметь обычный преимущества для решения большинства проблем сценария №2. Отличное решение этой проблемы должно учитывать и такие вещи. Полная общность этого вопроса, несомненно, является увлекательной проблемой.
В какой форме (язык, домен, логическая система и т. Д.) Вы ищете ответ? Просто процедурный/OO псевдокод? Или SQL/Relational/D-like declartive? – RBarryYoung
Предпочитаемый псевдокод алгоритма с четким путем для создания операторов SQL через алгоритм. –
Утверждения «не поддерживают проверку отложенных ограничений» и «Строки могут быть для нескольких таблиц» противоречивы в соответствии с моим пониманием реляционных логических операторов: отдельные модифицирующие операторы изменяют только один объект. Транзакции могут распространять это на несколько измененных объектов, но только путем отсрочки проверки ограничений до конца транзакции. – RBarryYoung