Структурирование базы данных ежедневных продаж - PullRequest
1 голос
/ 07 января 2012

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

  • 5 января 2011 года поставщик А зарабатывает на своих продуктах в общей сложности 500 долларов США
  • 5 января 2011 года поставщик А зарабатывает на всех 200 долларовего продукты
  • 6 января 2011 года поставщик B зарабатывает на своих продуктах 450 долларов
  • 6 января поставщик B получает на своих продуктах 75 долларов

Текущая структура у меня есть:

PROVIDER table

  • рк
  • провайдер

PRODUCT table

  • поставщик (FK)
  • продукт
  • дата начала продаж (продажи)
  • дата окончания

start_date и end_dateкогда продажи продукта могут произойти.Он используется только для справки и больше ни на что не влияет.

SALES table

  • product (FK)
  • sales
  • Как сохранить дату ??

sales будет дневной выручкой ($) для продаж этого продукта.

Я не совсем уверенкак хранить продажи.Продажи будут рассчитываться только как ежедневная сумма для каждого продукта.Как лучше всего структурировать таблицу SALES?Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 января 2012

Таблица продуктов:

  • Эта таблица должна быть «временной» по своей природе.Это означает, что он может изменяться со временем.
  • В 2011 году вы можете продать продукт А за 15,99 долларов, но в 2012 году вы хотите продать тот же продукт за 16,99 долларов, поэтому вы хотите, чтобы ваш стол был достаточно гибким для этого.тип изменения.
  • Несмотря на то, что данные, хранящиеся в этой таблице, достаточно гибкие, необходимо соблюдать осторожность при удалении продукта.Если вы удалите продукт, он либо потеряет все соответствующие транзакции продаж в таблице продаж, либо удалит их (в зависимости от поведения FK).

Таблица продаж:

  • Эта таблица должна иметь «транзакционный» характер.Это означает, что строка представляет продукт, связанный с продажей, замороженный во времени.
  • Если покупатель A приобрел продукт A за $ 15,99 в 2011 году, вы хотите записать эту транзакцию как есть, ничего не изменилось с данными в любой моментсо временем это отражает транзакцию.
  • Если покупатель B приобрел тот же Продукт A, но за 19,99 долл. США, вы хотите зарегистрировать его как отдельную транзакцию.Конечно, это тот же продукт, но эта строка представляет новую транзакцию.

При вышеупомянутой настройке вы можете изменять цены так, как считаете нужным в таблице product, но это не повлияетпродажи уже зарегистрированы в таблице sales_transaction.

Псевдо-схема:

product:

  • id int (11) без знака, не ноль auto_increment
  • имя varchar (255)
  • десятичная цена (14,2)
  • первичный ключ (id)
  • уникальный ключ (имя)

sales_transaction:

  • id int (11) unsigned not null auto_increment
  • product_id int (11) unsigned not null
  • provider_id int (11) unsigned notnull
  • десятичная цена (14,2)
  • create_at datetime default '0000-00-00 00: 00: 00'
  • внешний ключ (product_id) ссылается на продукт ('id')) при каскаде удаления
  • внешний ключ (provider_id) ссылается на провайдера ('id') при каскаде удаления

provider:

  • id int (11) без знакаnull
  • name varchar (255) not null
  • первичный ключ (id)
  • уникальный ключ (name)

Теперь вы можете запуститьзапросы для получения суммирования любого продукта на любую дату для любого поставщика, как вы просили в своем вопросе.

Пример запроса:

# On Jan 5, 2011, Provider A makes $500 total off of its products
SELECT prov.*, SUM(sales.price)
FROM
    provider AS prov
INNER JOIN
    sales_transaction AS sales on sales.provider_id = prov.id
WHERE
    provider.name = 'Provider A'
AND
    sales.created_at BETWEEN '2012-01-05 00:00:00' AND '2012-01-05 23:59:59'
GROUP BY
    prov.id

Предоставленная схема имеет скелетный характер, поэтому не стесняйтесь добавлять столбцы в соответствии с требованиями вашего бизнеса, но это должно привести вас в правильном направлении.

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

0 голосов
/ 07 января 2012

Почему бы не поле даты в таблице продаж?Это сделало бы каждую запись общей суммой продаж для определенного продукта на определенную дату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...