powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Как правильно выбрать данные из БД?
18 сообщений из 18, страница 1 из 1
Как правильно выбрать данные из БД?
    #37513800
mlevel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обдумываю проект биллинга для небольшого проекта предоставления услуг.
Подскажите пожалуйста как правильно делать обрабоку записей оплат пользователей в БД: выбрать все сразу(нужно много памяти при большом количестве данных) одним запросом или поочередно отдельными запросами делать обработку каждой записи?
Это касается не только обработки оплат, но и данных профиля пользователя(тарифный план, допустимий лимит, статус).
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37513860
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от того насколько нестандартный расчет, и какую БД используешь.
Если операции относительно простые, то можно вообще ничего не тащить на клиента, а посчитать средствами СУБД.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37513921
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlevel,

пачками. Например по 100 - 1000 записей (или за час, сутки итп).
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37514143
mlevel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думал сделать триггерами, но не кошерно как-то выносить всю логику расчета в БД.

Если считать пачками, надо ставить какой-то флаг/метку на записи, что ее уже обработали? Получаеться так.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37514160
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясни пожалуйста, как твой вопрос относится к теме форума (С/С++)?
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37514314
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlevelДумал сделать триггерами, но не кошерно как-то выносить всю логику расчета в БД.
Вообще-то вся логика в триггерах это идеальный вариант, т.к. база всегда находится в актуальном состоянии и не требует доп.расчетов для использования.
Главный минус триггеров в том что не всегда их можно использовать из-за того что они требуют время на отработку, а это время не всегда есть в реальной системе.
Тут все зависит от СУБД которую ты собрался использовать, поэтому лучше поспрашивать в профильном форуме, о чем выше намекнули
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37514739
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это делают хранимкой в конце периода.

Тему нужно отсюда убрать.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37683217
mlevel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если записей будет порядка нескольких сотен тысяч, как будет вести себя хранимая процедура?

Думал сделать отдельным бинарником по cron:
Код: sql
1.
2.
3.
4.
5.
user_prices = SELECT * FROM `Тарифные планы пользователей`;

while(<user_pirces>) {
    do(INSERT INTO `Движение средств по аккаунтах` VALUES(....) WHERE `USER_ID` = XXX);
}



Но опять же, если пользователей много(несколько сотен тысяч) и у каждого по 2-3 прайса, то наверно такая конструкцыя будет не оптимальная?

Хотя насколько я знаю больших проектов типа UTM NetUP, LanBilling, Гидра вся логика работы с БД вынесена в отдельный демон.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37683227
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> А если записей будет порядка нескольких сотен тысяч, как будет вести себя
> хранимая процедура?

А если записей порядка нескольких сотен тысяч, то это уже неправильно,
потому что нафига тебе столько записей ?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37683273
mlevel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например сейчас есть порядка 10 000 клиентов, минимум 2 прайса у каждого.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37691825
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlevel
Код: sql
1.
...SELECT * FROM...



...наверно такая конструкцыя будет не оптимальная?..

звёздочка в селектах - зло. это как минимум не оптимально и лишено смысла. целесообразно юзать в качестве примеров для студентов, дабы сконцентрировать внимание на остальном.

по вопросу...
в зависиомости от сущностей на клиенте и делайте выборку. например если вы оперируете сущностью учётка(она одна) - то и качайте её. если вы юзаете логическую сущность - выборка по условиям - то юзайте запрос группы записей.

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

(круглый)
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37696882
mlevel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Более конкретно.

Есть примерно такая, упрощенная структура:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
; Таблица аккаунтов клиентов
CREATE TABLE `accounts` (
`ac_id` INT NOT NULL AUTO_INCREMENT,
`ac_number` INT NOT NULL,
`ac_status` INT NOT NULL,
`ac_description` VARCHAR,
);

; Таблица списаний/начисление по аккаунах
CREATE TABLE `account_operations` (
`acop_id` INT NOT NULL AUTO_INCREMENT,
`acop_ac_id` INT NOT NULL,
`acop_money` INT NOT NULL,
`acop_datetime` DATETIME NOT NULL,
`acop_type` INT,
`acop_description` VARCHAR,
  FOREIGN KEY (acop_ac_id) REFERENCES acсounts(ac_id))
);


; Таблица тарифов
CREATE TABLE `prices` (
`pr_id` INT NOT NULL AUTO_INCREMENT,
`pr_name` VARCHAR NOT NULL,
`pr_money` INT NOT NULL,
`pr_description` VARCHAR,
`pr_type` INT NOT NULL,
);

; Таблица соответствий тарифов к аккаунтам
CREATE TABLE `account_prices` (
`acpr_id` INT NOT NULL AUTO_INCREMENT,
`acpr_ac_id` INT NOT NULL,
`acpr_pr_id` INT NOT NULL,
FOREIGN KEY (acpr_ac_id) REFERENCES acсounts(ac_id))
FOREIGN KEY (acpr_pr_id) REFERENCES prices(pr_id))
);



Каждый день нужно для каждого аккаунта начислять абонплату в зависимости от его тарифа/тарифов.

Получаеться что-то такое нужно запускать по cron'у (было удобнее и быстрее писать на PHP, но не факт что работает):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
$select_accounts = "SELECT * FROM `account_prices` INNER JOIN `prices` ON `account_prices`.`acpr_pr_id` = `prices`.`pr_id`";
$result_accounts = mysql_query($select_accounts);

while($row = mysql_fetch_array($result_accounts)) {
        $money = (-1)*$row['pr_money'];
        $account = $row['acpr_ac_id'];
        $ins_query = "INSERT INTO `account_operations` VALUES('', $account, $monet, NOW(), '' ,'')";
        $fin = mysql_query($ins_query);
}



Насколько это правильно?

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37696900
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlevelНасколько это правильно?
Мне трудно назвать вещь более неправильную. Возможно, в MySQL иначе никак - не знаю, а в нормальных СУБД это делается job-ом, выполняющим хранимку (которая в данном случае сводится к оператору insert / select, хотя в реальности будет посложнее).
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37697020
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
$select_accounts = "SELECT * FROM `account_prices` INNER JOIN `prices` ON `account_prices`.`acpr_pr_id` = `prices`.`pr_id`";
$result_accounts = mysql_query($select_accounts);

while($row = mysql_fetch_array($result_accounts)) {
        $money = (-1)*$row['pr_money'];
        $account = $row['acpr_ac_id'];
        $ins_query = "INSERT INTO `account_operations` VALUES('', $account, $monet, NOW(), '' ,'')";
        $fin = mysql_query($ins_query);
}



Насколько это правильно?

Неправильно на миллион процентов, как уже сказали. MySQL ничем не хуже других,
и делается это одним insert ... select.

И нафига тебе вставлять пустые записи ?
VALUES('', $account, $monet, NOW(), '' ,'')
Надо сразу же вычислять нужные данные.

1-им селектом. Можно использовать хранимки, но пока тут не видно ничего, что вызывало бы строгую необходимость этого.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37697211
mlevel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В реальности будет сложнее тем, что:
1. Провести начисление абонплаты, только при достаточном количестве средств на счету, а также при соответствующим статусе аккаунта.
2. В зависисти от некоторых условий сделать скидку от суммы начисленной абонплаты.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37697603
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mlevel,
либо job + бизнес логика в БД
либо ОРМ +бизнес логика на апп сервере.
Есть часть народа, которая утверждает, что большинство биллинга по 2 варианту.
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37697639
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Есть часть народа, которая утверждает, что большинство биллинга по 2 варианту.
Это в случае а-ля риалтаймового биллинга. Тогда все необходимые данные прочно прописаны в памяти аппсервера и сразу за исчерпанием счёта следует отрубание соединения. Но никак не в варианте "взять с сервера миллион данных, сделать пару простых операций и запихнуть обратно".
...
Рейтинг: 0 / 0
Как правильно выбрать данные из БД?
    #37697786
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,
конечно, я шире сказал. Вообще про архитектуру биллинг проектов.
Без деления на плохие и хорошие.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Как правильно выбрать данные из БД?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]