Таблица продуктов:
- Эта таблица должна быть «временной» по своей природе.Это означает, что он может изменяться со временем.
- В 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.Если вы решили хранить в местном часовом поясе, вы столкнетесь с любым количеством головных болей, если вы совершаете какие-либо продажи, требующие конвертации из вашего местного часового пояса.