Головна сторінка
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.6 MB
Час: 0.044 c
14-22329
Dima-k17
2001-11-03 15:12
2002.01.08
Часи Delphi закінчилися?


1-22083
DeNNiss
2001-12-19 12:06
2002.01.08
Допоможіть будь ласка!


1-22228
nazgul
2001-12-15 14:28
2002.01.08
Як зробити?


4-22489
Skiv
2001-11-05 09:55
2002.01.08
Висновок версії * .exe


14-22353
Кречет
2001-11-02 10:13
2002.01.08
Я в шоці





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