|
|
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
Добрый день. На сервере спроектирована БД, согласно приложенной ниже схеме. Поскольку ограничение целостности подразумевает и создание триггерных функций, необходимая следующая: проверка, что выдаваемая именно сейчас книга (положим, код выдачи) могла быть выдана, что общее количество экземпляров именно на ней не закончилось. Изначально я вставляла проверку такого вида: сравнивала код экземпляра с общим количеством экземпляров, если код экземпляра превышал общее количество, происходил откат транзакции. Но это неправильно. Видимо, факт выдачи - это код книги + дата выдачи не NULL + дата возврата NULL. Требуется посчитать количество записей удовлетворяющих данному условия и сравнить с общим количеством. Сделала я вот что: IF (SELECT COUNT(*) FROM "Выданные книги" WHERE "Код книги = ?" AND "Дата выдачи" ≠ 0 AND "Дата возврата" = 0) > (SELECT "Всего экземпляров" FROM "Книги" WHERE "Код книги = ?") а дальше что? Верно ли построила сам синтаксис? Функция count может содержать в себе такой огромный запрос? Я уже запуталась, как это должно выглядеть в рамках postgreSQL. Буду рада помощи. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2016, 13:15 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
linali... IF (SELECT COUNT(*) FROM "Выданные книги" WHERE "Код книги = ?" AND "Дата выдачи" ≠ 0 AND "Дата возврата" = 0) > (SELECT "Всего экземпляров" FROM "Книги" WHERE "Код книги = ?") а дальше что? Верно ли построила сам синтаксис? Функция count может содержать в себе такой огромный запрос? Я уже запуталась, как это должно выглядеть в рамках postgreSQL.Здесь проблема не в синтаксисе, IMHO, а в логике. Совершенно непонятно по каким правилам идёт регистрация выдачи/возврата книг в таблице "Выданные книги". Т.е., что делается, когда фиксируются события. Здесь не надо ничего изобретать своего, это автор схемы должен Вам пояснить, а не пытаться догадаться, как он это видит. Мне, например, вообще видится нарушение 3НФ. Ведь если указана "Дата возврата", то зачем нужна "Отметка о возврате"? Впрочем, вопросов к этой схеме гораздо больше, это лишь простейший из них. Так что не фантазируйте, а спрашивайте автора схемы. И только потом уже пытайтесь писать запрос, а писать его, когда Вы даже не понимаете, каким образом происходит фиксация события, бессмысленно. А синтаксис легко и в help-е подсмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2016, 14:38 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
linali, Кто такие картинки рисует ? (точнее, что ?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2016, 14:51 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
linali, авторIF (SELECT COUNT(*) FROM "Выданные книги" WHERE "Код книги = ?" AND "Дата выдачи" ≠ 0 AND "Дата возврата" = 0) > (SELECT "Всего экземпляров" FROM "Книги" WHERE "Код книги = ?") а дальше что? Как что? Как что? Выкинуть этот код нахер, так как он некорректный. Ну или делайте блокировку, об которую процессы-выдаватели книг смогут синхронизироваться и выдавать книги строго по очереди. Синтаксис, впрочем, все равно бредовый. Вы студентка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2016, 21:31 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
Author the new onelinali, <> Вы студентка? сдаётся, что это чей--то бот. вот этот текст авторсравнивала код экземпляра с общим количеством экземпляров я уже видел в другом месте. кажется в "проектировании БД" а вот это : авторВидимо, факт выдачи - это код книги + дата выдачи не NULL + дата возврата NULL. наводит на мысль, что в "маленькой пси--лечебнице"(тм), день открытых дверей вторая мысль - язык для автора не родной. тогда вторая квота -- почти верное умозаключение немного косноязычное но как-то всё очень грустно с выражением мысли на естественном языке скорее бот, чем иноземец ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 00:24 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
пригляделся к схеме -- там минимум одна смысловая ошибка -- поле "код выдачи" (суррогат) именовано как "код экземпляра" -- откуда многие проблемы и тараканы в мыслях. если эту схему делал тот же "препод", который рассуждал о злоумышленниках, избирательно курочащих данные в бд -- то в "мпл"(тм) точно месячник открытых дверей. верните его обратно. 2ТС : у вас, как тут правильно подбрасывают, не учтена возможность конкурентной "выдачи" книг несколькими библиотекарями. т.е. при расчете каунта по выданным книгам вы должны наложить лок либо на всю табличку выданных книг, либо транзакционный advisory -- на код книги, либо создать триггерно обновляемый "матвью" количества выданных -- и лочить в нем код книги, организуя очередь библиотекарей к ресурсу "код данной книги". (последнее можно, но не нужно, совместить с табличкой книг) далее открываете букварь по серверному программированию на нравящемся вам процедурнои языке, и смотрите, как писать на нем триггера в пж. http://www.postgresql.org/docs/9.5/interactive/server-programming.html http://www.postgresql.org/docs/9.5/interactive/xplang.html http://www.postgresql.org/docs/9.5/interactive/plpgsql-trigger.html locks: http://www.postgresql.org/docs/9.5/interactive/sql-lock.html advisory: http://www.postgresql.org/docs/9.5/interactive/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 08:44 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
qwwq, Гораздо проще сделать уникальный условный индекс Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 10:47 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
Author the new oneqwwq, Гораздо проще сделать уникальный условный индекс Код: sql 1. ?Ыыыыыыыы во первых "код ёкземпляра" -- и так пк. т.е. это или не таблица движений, а таблица состояний ёкземпляров , либо это таки таблица движений, но тогда "код ёкземпляра" -- это "код выдачи" и к экземпляру не имеет реального отношения. во вторых вам надо залочить (выстроить в очередь) "код книги", а не "код ёкземпляра" (что бы он не значил) т.ч. мимо тазика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 10:59 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
qwwq, боюсь что вы тут правы. скорее всего это автомат состояний, отслеживающий состояние каждого из екземпляров (отсюда код екземпляра - инвентарный номер книги). странная схема однако. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 11:05 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
qwwq, Да, вы правы. Другое дело, что я что-то вообще не понимаю в чем проблема - если у нас есть экземпляры, то как их вообще можно выдать два раза? Ссылка на читателя-то одна. Тут это просто не выйдет, разве что будут потерянные обновления, но это уже другой вопрос, и в триггере надо проверять что-то вроде if old."Код читателя" is not null and old."Код читателя"<>new."Код читателя" then raise sqlstate 'ER001' using message 'Book already borrowed'; end if; Ну и проверку, чтобы если Дата возврата is not null, то Код читателя is null - и наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 11:14 |
|
||
|
Помогите, пожалуйста, с синтаксисом, логика ясна
|
|||
|---|---|---|---|
|
#18+
Author the new oneqwwq, Да, вы правы. Другое дело, что я что-то вообще не понимаю в чем проблема - если у нас есть экземпляры, то как их вообще можно выдать два раза?<> если это таблица состояний экземпляров -- надо не допустить учёта "поручиков киже" [не существующих экземпляров]. т.е. обеспечить, чтобы значение в поле "Всего экземпляров" описателя книг [всегда] совпадало с количеством записей в таблице состояний экземпляров. если это именно таблица состояний. (нужен ли там учёт списанных и сожжённых -- не знает видимо даже "препод"). если же это таблица движений -- то её пк "код экземпляра" не имеет никакого отношения к экземпляру, а является ид "выдачи". вообще правильно говорить о "партионном учете" (партия==экземпляр) надо в терминах справочника партий (т.е. экземпляров), и таблицы движения, а не сворачивать все в одно -- так что трудно понять, с чем именно мы имеем дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2016, 12:11 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=1997283]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
202ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 507ms |

| 0 / 0 |
