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

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

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

Тему нужно отсюда убрать.
...
Рейтинг: 0 / 0
28.02.2012, 21:23
    #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
28.02.2012, 21:32
    #37683227
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно выбрать данные из БД?
> А если записей будет порядка нескольких сотен тысяч, как будет вести себя
> хранимая процедура?

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

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



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

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

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

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

(круглый)
...
Рейтинг: 0 / 0
09.03.2012, 02:16
    #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
09.03.2012, 03:08
    #37696900
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно выбрать данные из БД?
mlevelНасколько это правильно?
Мне трудно назвать вещь более неправильную. Возможно, в MySQL иначе никак - не знаю, а в нормальных СУБД это делается job-ом, выполняющим хранимку (которая в данном случае сводится к оператору insert / select, хотя в реальности будет посложнее).
...
Рейтинг: 0 / 0
09.03.2012, 12:12
    #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
09.03.2012, 16:26
    #37697211
mlevel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно выбрать данные из БД?
В реальности будет сложнее тем, что:
1. Провести начисление абонплаты, только при достаточном количестве средств на счету, а также при соответствующим статусе аккаунта.
2. В зависисти от некоторых условий сделать скидку от суммы начисленной абонплаты.
...
Рейтинг: 0 / 0
10.03.2012, 11:29
    #37697603
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно выбрать данные из БД?
mlevel,
либо job + бизнес логика в БД
либо ОРМ +бизнес логика на апп сервере.
Есть часть народа, которая утверждает, что большинство биллинга по 2 варианту.
...
Рейтинг: 0 / 0
10.03.2012, 12:34
    #37697639
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно выбрать данные из БД?
Petro123Есть часть народа, которая утверждает, что большинство биллинга по 2 варианту.
Это в случае а-ля риалтаймового биллинга. Тогда все необходимые данные прочно прописаны в памяти аппсервера и сразу за исчерпанием счёта следует отрубание соединения. Но никак не в варианте "взять с сервера миллион данных, сделать пару простых операций и запихнуть обратно".
...
Рейтинг: 0 / 0
10.03.2012, 15:27
    #37697786
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно выбрать данные из БД?
softwarer,
конечно, я шире сказал. Вообще про архитектуру биллинг проектов.
Без деления на плохие и хорошие.
...
Рейтинг: 0 / 0
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Как правильно выбрать данные из БД? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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