Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
23 / 23 / 9
Регистрация: 09.07.2014
Сообщений: 95

Стоит ли лочить таблицы?

09.12.2015, 14:36. Показов 714. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит ли лочить таблицы (строки) при таких условиях (если надо, то как?):

Упрощенная схема:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE shop.model ( -- модель продукта
    "id" SERIAL PRIMARY KEY,
    "name" TEXT NOT NULL DEFAULT 'NO_NAME',
    "code" VARCHAR(4) NOT NULL UNIQUE, -- код модели, участвует в артикуле
    "next_product_index" INTEGER NOT NULL DEFAULT 1 -- автоинкремент для продуктов
);
CREATE TABLE shop.product ( -- продукт
    "id" SERIAL PRIMARY KEY,
    "model_ref" INTEGER NOT NULL REFERENCES shop.model ("id"),
    "index" INTEGER NOT NULL DEFAULT 0 -- индекс продукта, начинается с 1 для каждой новой модели
    /* долго думал, почему триггер валится с ошибкой, что NEW не присвоено значение,
    пока не догадался поставить default*/
);
INSERT INTO shop.model ("name", "code")
VALUES
    ('Orange', 'ORG'),
    ('Apple', 'APL'),
    ('Kiwi', 'KW');
Каждый продукт должен иметь артикул вида <код_модели><номер_продукта>. Для каждой модели номер продукта начинается с 1 и с каждым новым продуктом увеличивается на единицу. Цены привязаны к моделям товара, а продукты отличаются рисунком, поэтому такое деление. В продажу идут продукты (светильники, не фрукты).

Гарантируется, что продукты для определенной модели сможет добавлять только один человек.

Прикрутил триггер
SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION bind_index() RETURNS TRIGGER AS $bind_index$
DECLARE next_index INTEGER;
BEGIN
    next_index := (SELECT "next_product_index" FROM shop.model WHERE "id" = NEW.model_ref);
    NEW."index" = next_index;
    UPDATE shop.model SET "next_product_index" = "next_product_index" + 1 WHERE "id" = NEW.model_ref;
    RETURN NEW;
END
$bind_index$ LANGUAGE plpgsql;
 
CREATE TRIGGER on_new_product BEFORE INSERT ON shop.product
FOR EACH ROW EXECUTE PROCEDURE bind_index();
Пример вставки

SQL
1
2
3
4
5
INSERT INTO shop.product (model_ref)
VALUES
    (1),(1),(1),(1),
    (2),(2),
    (3),(3),(3);
Без триггера и поля "next_product_index" вставка была бы такой (нужно следить за тем, какое число было последним):
SQL
1
2
3
4
5
INSERT INTO shop.product ("model_ref", "index")
VALUES
    (1, 1),(1, 2),(1, 3),(1, 4),
    (2, 1),(2, 2),
    (3, 1),(3, 2),(3, 3);
Пример выборки
SQL
1
2
3
4
5
6
SELECT
    CONCAT(m."code", LPAD(CAST(p."index" AS VARCHAR(2)), 2, '0')) AS product_code
FROM shop.product AS p
INNER JOIN shop.model AS m
    ON m."id" = p."model_ref"
WHERE m."id" = 1;
Результат
Code
1
2
3
4
5
6
 product_code
--------------
 ORG01
 ORG02
 ORG03
 ORG04
Вопрос не для учебы, а для разрабатываемого проекта. Транзакциями ни разу не пользовался, как работать с локами, так и не понял.

Если есть какие-то предложения по оптимизации, то хотелось бы и их узнать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.12.2015, 14:36
Ответы с готовыми решениями:

Имеет ли смысл лочить всё тело метода?
Доброго времени суток. Есть такой вопрос. Имеет ли смысл лочить в каждом методе весь код. Интересует по большей части цикл foreach. Ведь...

Как правильно лочить записи в базе (SQL 7.0/2000)
Господа, не сочтите за труд, подскажите: какие есть варинты блокирования обращений других пользователей к определенным записям в базе,...

Когда нужно лочить ( делать lock() ) сразу нескольких мьютексов
Здравствуйте товарищи девелоперы! Прошу прощения за банальный в своем роде вопрос, однако когда мне может понадобиться сделать lock() на...

1
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
09.12.2015, 23:46
Не надо никаких дополнительных локов. MVCC здесь все разрулит. Тем более болятся нечего, так как
Цитата Сообщение от AsakuraKazumi Посмотреть сообщение
Гарантируется, что продукты для определенной модели сможет добавлять только один человек.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2015, 23:46
Помогаю со студенческими работами здесь

Стоит ли для каждой таблицы БД создавать по форме?
Добрый день. Имеется несколько таблиц БД MSSQL реализация Winforms C#, вопрос в следующем необходимо реализовать работу по...

Дайте совет стоит или не стоит пользоваться этим хостингом
Дайте совет стоит или не стоит пользоваться этим хостингом. Хостинг находится по адресу www.lipak.ru Предложение воспользоваться их...

Стоит ли ставить 10 винду заместо 7 домашней? Стоит ли обновлять с 7 на 10 в автоматическом режиме до июля?
У меня 7 лицензия. Но я не умею ставить винду=( Подскажите мне пожалуйста, стоит ли с виндовс 7 домашней переходить на 10?? Будет ли...

Курсы по PHP Учебный центр «Специалист» при МГТУ им.Н.Э.Баумана Стоит или не стоит?
Всем привет. Кто-нибудь проходил курсы по PHP в &quot;Учебный центр «Специалист» при МГТУ им.Н.Э.Баумана&quot;(вебинары). Если да то какие...

Какую версию Delphi стоит изучать, и стоит ли вообще
Понимаю, вопрос задавался неоднократно, но прошу - не гоните мокрыми тряпками. мой вопрос довольно конкретен. Вообще задался целью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru