Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Бази";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

Вниз

ВСІМ ПРИВІТ! Роблю якийсь журнал. Звідки завдання .... Знайти схожі гілки


@andrew   (2001-12-04 11:38) [0]

... необхідно зробити перевірку на унікальність введеної дати. Щоб на одне і теж час не доводилося дві події. Не підкажете, як це перевірку вбити конструктором таблиці або запиту перед рядком "insert into ....."? Дякуємо!



Val   (2001-12-04 13:11) [1]

потрібна не перевірка, а унікальний індекс, в який входитиме це поле дати



@andrew   (2001-12-04 13:58) [2]

А это как: "в который будет входить поле даты"? Имеется ввиду, что поле "дата" уникально? Если это имеется ввиду, то это не совсем годится, т.к. на самом деле, интересует чтобы временные интервалы события не пересекались. Напр. одно событие с 5 до 8 утра. Другое - с 6 до 7. Если делать проверку по уникальности индекса, то SQL позволит сделать запись, а не должен.



@andrew   (2001-12-04 14:05) [3]

На самом деле, можно придумать несколько алгаритмов решения моей задачи. Самый элементарный, который у меня в голове крутится, а именно: сначала возвращать все значения, потом перебирать их, смотреть... и т.д. - очень длинный и тормозной. Может просто кто-нибудь сталкивался и знает какое-нибудь готовое решение моего вопроса: быстрое и простое и все-таки, желательно, не на уровне софта, а на уровне SQL или запроса SQL, т.к. в варианте решения вопроса на уровне софта при работе сразу большого кол-ва пользователей задержка во времени "select * ...; проверка.....; если все в порядке-insert что-то...." может оказаться роковой.

Еще раз заранее Спасибо!



Mick   (2001-12-04 14:07) [4]

Вообще нормальные журналы пишутся последовательно. Дата вставляется не клиентом, а сервером. Если некий процесс начался в 5, а кончился в 8, то в журнале будет 1 запись о начале(5 утра), одна запись об окончании (8 утра) и туча записей между ними, которые расскажут что в это время было.



Nest   (2001-12-04 14:14) [5]

Да, вчера у меня тоже такой вопрос встал.
Но я пока отложил его решение - есть поважнее дела.
А вообще я думаю, у тебя период должен характеризоваться 2мя параметрами-
дата_время_начала и дата_время_конца.
Так вот если в каждый момент времени может происходить только олно событие, то при вводе нужно проверять,чтобы :
[1.дата_время_начала<дата_время_конца]
2.Несуществует записи,у которой дата_время_конца пусто либо больше вводимого дата_время_начала.

Наверное эти мысли надо до ума довести - небыло времени.Пока только смутная идея.
Покатит?



@andrew   (2001-12-04 14:17) [6]

>Mick
Не совсем то.
Речь идет не о журнале в компьютерном смысле слова, а о журнале, как об органайзере, ежедневнике, в который можно записать некие планы на будующее время.



@andrew   (2001-12-04 14:24) [7]

> Nest
Ну да, в принципе идея ясна. Но это софтверный способ решения. Т.е. грубо говоря, перед тем, как я хочу что-то записать я делаю:
1. Возвращаю все записи, сортируя их по дате_времени.
2. Становлюсь на последнюю строку (Query1.Last)
3. Если время начала того, что я хочу вставить >= время конца последней записи, то можно сделать Insert.
А можно ли тоже самое, только не софтом, а запросом?

Я просто боюсь, что при одновременной работе нескольких людей можно облажаться.



Nest   (2001-12-04 14:36) [8]

А что так не покатит?
1.Query1: Select max(ДВК)
2.If query1.fields[0].asdatetime>ДВН_вводимое then abort

Чтобы сделать и проверку и вставку одним запросом, надо, IMHO, нехило изъ№%@ться. А парой - несложно.



Nest   (2001-12-04 14:38) [9]

Может и можно - просто посидеть подумать над элементарной логикой,и как представить это в WHERE запроса.
Я идею дал - дальше попытайся подумать. У меня просто реально времени нет.



Mick   (2001-12-04 14:39) [10]

Можно пойти по пути денормализации таблицы журнала.
Структура:
1.Поле ключа (любой искусственный Primary Key)
2.Дата
3 Поля часов (по количеству часов в сутках)

Далі:
Клиент проверяет непрерывность вставляемого интервала (легко)
Триггер в таблице проверяет есть ли NOT NULL значения в одноименных полях в записях для такой же даты.
Если есть, значит поймали перекрытие событий, если нет - все нормально.



Sam   (2001-12-04 19:27) [11]

А как насчет триггеров?



kaif   (2001-12-04 20:17) [12]

Я пару років тому вирішував таку точно завдання для організації прийому у лікарів. Робив на InterBase. Алгоритм зовсім нетривіальний вийшов. Для того, щоб це працювало швидко, зрозуміло, потрібні індекси. Довелося створювати проміжки, як окремі записи, потрібні були збережені процедури "дроблення" проміжків і "склеювання". Спочатку створюються "проміжки вільного часу", потім вони дробляться, у міру того, як якийсь час займається. Відповідно, їх кількість поступово зростає. Конкретні справи прив'язуються до сурогатного унікальному індексу цих проміжків. Працювало швидко і несуперечливо при одночасному доступі ряду користувачів. Я тоді багато думав і пробував різних варіантів. Без перетворення окремих проміжків в об'єкти, які б створювалися, віддалялися і використовувалися - іншого хорошого рішення не знайшов.



сторінки: 1 вся гілка

Форум: "Бази";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

наверх









Пам'ять: 0.86 MB
Час: 0.033 c
3-21909
DeadMoroz
2001-12-03 15:21
2002.01.08
Доброго времени суток, потребую раді, плз


4-22499
YUS
2001-10-31 20:51
2002.01.08
FindWindow


1-22129
Aleksandr
2001-12-19 16:04
2002.01.08
Як прибрати мерехтіння свого скроллбар?


1-22080
Delphimun
2001-12-18 17:11
2002.01.08
Як завантажити курсор з ресурсу, а потім зберегти його на диску?


7-22433
igor_prg
2001-09-25 21:28
2002.01.08
Як зареєструвати клас ???





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в&#39;єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська