Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура базы данных, Оптимальная 
:(
    Опции темы
MoreHate
Дата 23.6.2006, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Есть простенькая бухгалтерская программка. Есть такая вещь как "расход".
Расход = списания брака + денежная выручка

Если немного абстрагироваться, то получаются такие таблички:

Списания:
ID | Date | WareID | Sum

Выручки:
ID | Date | Sum

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

Так вот, нужно регулярно выводить таблицу Расхода в таком виде

Дата | Выручка | Сумма списаний за день | Общая сумма


Вопрос. Как лучше это осуществить?

Если по "правилам", то нужно все вычислять на лету. Т.е. если мы сделаем выборку хотя бы за месяц, то уже будет считаться 30 сумм таблицы "Списание".

Можно сделать быстрее, но уж больно криво, как мне кажется. Ввести таблицу "Расход"
в которой хранить данные за каждый день и обновлять её после каждого действия.
Примерно так:
ID | Date | Gain | AllowancesSum | Sum

Я весь в сомнениях smile 
PM MAIL   Вверх
Akina
Дата 23.6.2006, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 454



Цитата(MoreHate @  23.6.2006,  07:35 Найти цитируемый пост)
Можно сделать быстрее, но уж больно криво, как мне кажется. Ввести таблицу "Расход", в которой хранить данные за каждый день и обновлять её после каждого действия.

Это называется "переопределенная база данных" и более чем настоятельно не рекомендуется.

Цитата(MoreHate @  23.6.2006,  07:35 Найти цитируемый пост)
Если по "правилам", то нужно все вычислять на лету. Т.е. если мы сделаем выборку хотя бы за месяц, то уже будет считаться 30 сумм таблицы "Списание".

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
MoreHate
Дата 23.6.2006, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Спасибо. Так и сделаю. 
PM MAIL   Вверх
beroal
Дата 23.6.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: нет
Всего: 3



Считай не лету. Подоптимизировать можешь когда программа начнёт реально тормозить, но вероятность этого невелика. 
PM WWW   Вверх
chief39
Дата 23.6.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: нет
Всего: 77



Если возникнет необходимость ускорения расчётов - можешь потом устроить дублирование данных(тысызыть скэшированные подсчёты). И использовать их, пеиодически обновляя. Но это только для действий без обратной связи. 
Например для отчётности месячной или ещё чего похуже. smile

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

Вообще и то и то - практика нормальная, но второй вариант требует хорошего проектирования и аккуратности. да и то, при необходимости
 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
MoreHate
Дата 24.6.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Я думаю, это не будет оффтопом. Все-таки тема та же.

Код

SELECT A.A_DATE, SUM(A.A_SUM), G.G_DATE, SUM(G.GAIN) FROM OUT_ALLOWS A, OUT_GAINS G  GROUP BY A.A_DATE, G.G_DATE


Никак не могу сообразить, как можно соединить данные с двух таблиц по датам. Тут какая-то группировка хитрая? 
PM MAIL   Вверх
bas
Дата 24.6.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: нет
Всего: 2



А join не пробовал использовать, в нем наглядней соединения. 
PM MAIL   Вверх
beroal
Дата 24.6.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: нет
Всего: 3



Цитата(MoreHate @ 24.6.2006,  06:19)
Я думаю, это не будет оффтопом. Все-таки тема та же.

Код

SELECT A.A_DATE, SUM(A.A_SUM), G.G_DATE, SUM(G.GAIN) FROM OUT_ALLOWS A, OUT_GAINS G  GROUP BY A.A_DATE, G.G_DATE


Никак не могу сообразить, как можно соединить данные с двух таблиц по датам. Тут какая-то группировка хитрая?

Я думаю, лучше подзапросами. Сначала сгруппировать и суммировать, чтобы дата в обоих таблицах стала уникальной, потом соединять.
Код

SELECT DT, A_SUM1, GAIN1
FROM ( SELECT A_DATE AS DT, SUM(A_SUM) AS A_SUM1, 
  FROM OUT_ALLOWS
  GROUP BY A_DATE
) A
FULL JOIN ( SELECT G_DATE AS DT, SUM(GAIN) AS GAIN1
  FROM OUT_GAINS
  GROUP BY G_DATE
) G
ON A.DT = G.DT

 
PM WWW   Вверх
MoreHate
Дата 25.6.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



beroal, не выполняется.

Или ошибка в запросе, или это особенности синтаксиса Firebird.

IbExpert выдал 
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 8.
SELECT.

Пойду почитаю мануал. Я с подзапросами слабо знаком. 
PM MAIL   Вверх
beroal
Дата 25.6.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: нет
Всего: 3



Я написал для MS SQL. В FireBird-е наверное можно выкрутиться, но лень думать. Я хотел дать общее представление об идее. 

Это сообщение отредактировал(а) beroal - 25.6.2006, 15:14
PM WWW   Вверх
MoreHate
Дата 25.6.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 22.3.2005

Репутация: нет
Всего: нет



Хм, в FireBird нет временных таблиц.

2Модератор: можно перекинуть вторую половину топика в форум по FireBird? Я думаю, что там помогут. 
PM MAIL   Вверх
LSD
Дата 25.6.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 1
Всего: 538



Цитата(MoreHate @  25.6.2006,  17:44 Найти цитируемый пост)
2Модератор: можно перекинуть вторую половину топика в форум по FireBird? Я думаю, что там помогут.

Тогда уж весь топик, т.к. вторая половина без первой, будет непонятна. 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Alex
Дата 30.6.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 7
Всего: 162



Какие временные таблицы, какие подзапросы, вы что людиииии....

Код

CREATE TABLE NEW_TABLE3 (
    ID     INTEGER NOT NULL,
    DATE1  DATE,
    "SUM"  INTEGER
);

INSERT INTO NEW_TABLE3 (ID, DATE1, "SUM") VALUES (1, '2006-06-30', 6);
INSERT INTO NEW_TABLE3 (ID, DATE1, "SUM") VALUES (2, '2006-06-30', 7);
INSERT INTO NEW_TABLE3 (ID, DATE1, "SUM") VALUES (3, '2006-06-29', 3);

CREATE TABLE NEW_TABLE4 (
    ID     INTEGER NOT NULL,
    DATE2  DATE,
    "SUM"  INTEGER
);

INSERT INTO NEW_TABLE4 (ID, DATE2, "SUM") VALUES (1, '2006-06-28', 9);
INSERT INTO NEW_TABLE4 (ID, DATE2, "SUM") VALUES (2, '2006-06-30', 7);


Запрос:
Код

SELECT
  case
    WHEN (t3.DATE1 is null) then t4.DATE2 else t3.DATE1
  end as date_sum
  ,SUM(t3."SUM") as sum_t3
  ,t4."SUM" as sum_t4
FROM NEW_TABLE3 t3 FULL JOIN NEW_TABLE4 t4 ON t3.DATE1 = t4.DATE2
GROUP By 1, 3


Результат
Цитата

DATE_SUM    SUM_T3    SUM_T4
28.06.2006     null             9
29.06.2006     3              null
30.06.2006     13              7



    

Это сообщение отредактировал(а) Alex - 30.6.2006, 10:06


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0889 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.