2012-02-17 3 views
0

Мне нужно избегать перекрытия диапазонов дат в моей базе данных. Я бы хотел, чтобы это было агностиком базы данных - это довольно сложная проблема, даже если она не является андростикой базы данных (http://asktom.oracle.com/pls/asktom/f?p=100:11:0%3a% 3a% 3a% 3aP11_QUESTION_ID: 474221407101). У меня есть только одно приложение, записывающее в базу данных. Из него читают несколько других, где критическая производительность чтения. Приложение, выполняющее запись, является потоковым - это веб-приложение и находится в кластере.Одиночный рабочий процесс или что-то большее, чем DB?

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

+0

Моей первой мыслью было бы написать триггер, который запускается на любом DML и обеспечивает соблюдение вашего бизнес-правила. Вероятно, работа для Oracle, не уверен в mySql. Каждый db отличается и имеет разные функции/функциональные возможности, поэтому удача с одним размером подходит для любого подхода. – tbone

ответ

0

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

CREATE TABLE MY_SCHEDULER (
    SCHEDULED_DATE DATE PRIMARY KEY, 
    OWNER_ID NUMBER(8) 
); 

SCHEDULED_DATE будет представлять один день и будет храниться со временем в 00:00. Первичная целостность ключа гарантирует, что никакие две записи не могут быть вставлены с тем же SCHEDULED_DATE. OWNER_ID - это ссылка на тех, кто «владеет» этой датой. Учитывая, что переменные DATE составляют 7 байт в Oracle, а число не слишком велико (максимум 22 байта), у вас не должно быть проблем с хранением. 100-летняя дата будет составлять всего около 10 МБ!

Смежные вопросы