2011-06-21 3 views
0

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

Пример счета:

OrderID |  Order Date | Amount 
    31   10/02/2011   £1.50 
    43   12/02/2011   £1.50 
    74   13/02/2011   £5.00 
            ======= 
          Total £8.00 

Если Total минус (например: -8,00), это значит, клиент должен мне деньги. Без минуса я плачу клиенту немного денег.

Вот что я придумал:

заказов Таблица

CREATE TABLE IF NOT EXISTS `orders` (
    `OrderID` int(11) NOT NULL AUTO_INCREMENT, 
    `Total` decimal(6,2) NOT NULL, 
    `OrderDate` datetime NOT NULL, 
    `Status` int(11) NOT NULL, 
    `userID` int(11) NOT NULL, 
    `InvoiceID` int(11) NOT NULL, 
    PRIMARY KEY (`OrderID`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

Счет Таблица

CREATE TABLE IF NOT EXISTS `invoice` (
    `InvoiceID` int(11) NOT NULL DEFAULT '0', 
    `InvoiceDate` datetime NOT NULL, 
    `Amount` decimal(6,2) NOT NULL, 
    `Status` int(11) NOT NULL, 
    PRIMARY KEY (`InvoiceID`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

invoice.Status (0 Обработка, 1 Счет Отправленные, 2 Отменено , 3 Completed) или что может быть лучше?

Оплата Таблица

CREATE TABLE IF NOT EXISTS `payment` (
    `PaymentID` int(11) NOT NULL AUTO_INCREMENT, 
    `InvoiceID` int(11) NOT NULL, 
    `Amount` decimal(6,2) NOT NULL, 
    `DatePayment` datetime NOT NULL, 
    `PaymentType` int(11) NOT NULL, 
    PRIMARY KEY (`PaymentID`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

payment.PaymentType = (1: Оплата получена от Клиента (задолжали деньги), 2: Оплата посланного Клиента) Результат

База данных:

mysql> select * from orders; 
+---------+-------+---------------------+--------+--------+-----------+ 
| OrderID | Total | OrderDate   | Status | userID | InvoiceID | 
+---------+-------+---------------------+--------+--------+-----------+ 
|  1 | 20.00 | 2011-06-18 15:51:51 |  1 | 123 |   1 | 
|  2 | 10.00 | 2011-06-19 15:51:57 |  1 | 123 |   1 | 
|  3 | 5.00 | 2011-06-20 15:52:00 |  1 | 123 |   1 | 
+---------+-------+---------------------+--------+--------+-----------+ 

mysql> select * from invoice; 
+-----------+---------------------+--------+--------+ 
| InvoiceID | InvoiceDate   | Amount | Status | 
+-----------+---------------------+--------+--------+ 
|   1 | 2011-06-30 15:55:21 | 35.00 |  1 | 
+-----------+---------------------+--------+--------+ 

mysql> select * from payment; 
+-----------+-----------+--------+---------------------+-------------+ 
| PaymentID | InvoiceID | Amount | DatePayment   | PaymentType | 
+-----------+-----------+--------+---------------------+-------------+ 
|   1 |   1 | 35.00 | 2011-06-29 15:56:16 |   1 | 
+-----------+-----------+--------+---------------------+-------------+ 

Im I на правильном пути? Что можно улучшить/изменить или предложить?

Спасибо.

+0

Все выглядит нормально - я бы предположил, что наличие 'Status' на обоих' order' и 'invoices' немного запутанно. Если заказы могут иметь статус, не зависящий от счета-фактуры, тогда все будет в порядке. – Blazes

+1

Спасибо за включение схемы в ваш исходный вопрос. Многие люди этого не делают. Я не вижу, чтобы они определялись здесь, поэтому не забудьте указать ваши внешние ключи ('orders.userID',' orders.InvoiceID', 'payment.InvoiceID'). – Wiseguy

+0

В зависимости от того, как применяются затраты, 'Total' на' orders' может оказаться недостаточным. Вы можете потребовать «Стоимость» и «Количество». Кроме того, вам могут потребоваться дополнительные сборы, взимаемые с 'Invoice', например. Доставка и обработка. Другими словами, сумма счета будет равна сумме заказа Стоимость * Количество + Доставка + Обработка. – Blazes

ответ

2

Выглядит хорошо.

Единственное, что я хотел бы добавить, - это некоторые детали, такие как идентификатор транзакции/номер чека в таблицу платежей. Таким образом, вы сохраняете все детали оплаты вместе.

+0

Это хорошая идея, спасибо. Как вы знаете, счет-фактура может содержать 1 или более заказов. Каков наилучший способ сгенерировать счет каждые 2 недели? Использование задания Cron, которое будет проверять заказы, а затем вставить в таблицу счетов и затем «обновить» order.invoice_id? ....... или когда я изменяю статус заказа на 1 (orders.status = 1), а затем обновляю orders.invoice_id (сначала он проверяет из таблицы счетов) –

+0

Если у вас есть возможность выставления счетов разных клиентов в разных расписаниях , затем создайте таблицу конфигурации клиента, чтобы сохранить расписание. Но да, используйте задание cron, которое запускается так часто, чтобы видеть, когда нужно создавать счета-фактуры. – NotMe

+0

Спасибо @Chris Lively, Как вы думаете, у меня должна быть таблица «OrderInvoice», в которой есть как идентификатор OrderID, так и идентификатор счета? Поэтому мне не нужен InvoiceID в таблице заказов. –

0

Это выглядит хорошо для меня, это то, что я сделал бы так же хорошо.

(я думаю, что платеж связан с заказом, но если вы намеревались связать его с фактурой это хорошо)

С уважением, MN

0

Не зная больше о ваших требованиях, так это так хорошо.

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

+0

Я объясню немного больше. Клиент выйдет в интернет и выберите магазин. Они размещают заказ в определенном магазине. Их порядок хранится в таблицах заказов и order_items. В следующем месяце я хочу создать счет-фактуру из StoreID, который отобразит список заказов (например: orders.StoreID). В счете-фактуре скажут мне, сколько стоит мне магазин или сколько мне нужно заплатить. Он вычисляет все заказы из заказов. Всего –

3

Хорошо, у вас здесь есть серьезные проблемы. Заказы имеют многоточие, счета-фактуры имеют несколько заказов, и платежи могут применяться к множеству заказов и счетов-фактур. Заказы могут появляться на нескольких счетах-фактурах (если они не платят правильные пути, которые являются общими).

Так что вам нужны связывание таблиц. Вы должны начать с таблицы ORDERINVOICE, которая имеет как идентификатор заказа, так и идентификатор счета. Затем таблицу ORDERPAYMENT с идентификатором paymentid и Order.

Вам также необходимо учитывать, что в ситуации заказа вам необходимо записать детали заказа, как это произошло в то время. Это означает, что, хотя вы должны иметь user_id для связи с текущим пользователем, вы должны записать имя пользователя, адрес фактурирования и отгрузочные данные, как это было во время заказа. Вам понадобится эта информация позже, чтобы разобраться с любыми вопросами в заказе. Далее вам необходимо убедиться, что вы храните информацию о заказе в отдельной таблице с именем ORDERDETAILS, в которой хранятся отдельные позиции, цена во время заказа и имя заказанного товара. Это понадобится вам по причинам бухгалтерского учета. Вы ни при каких обстоятельствах не хотите полагаться на соединение с таблицей продуктов, чтобы выяснить цену заказа в прошлом. Это приведет к тому, что ваши финансовые отчеты будут неточными.

+0

Спасибо за предложение HLGEM, не знаю, понял ли я ясно. Не могли бы вы привести пример таблиц проектирования баз данных, что вы имели в виду? Тогда я пойму лучше. Благодарю. –

+0

Я понял, что вы имели в виду для таблицы ORDERINVOICE ... Не должно таблица ORDERPAYMENT быть с payid и InvoiceID (а не OrderID)? ... В отношении упорядочения ситуации для хранения записи имени пользователя, адреса фактуры, названия продукта и стоимости продукта. Существует 3 варианта: версия (тип 2), таблица истории (тип 4) или дубликаты данных в Таблица заказов. Что было бы лучше? –

+0

Я бы сказал orderid и paymentID, потому что вы платите за предметы по заказам, а не за счет счета. Если я выложу вам счет три раза, прежде чем вы заплатите, деньги будут зачислены на заказ, а не на конкретный счет. Конечно, не все три счета-фактуры. Вы можете определить, что остается неоплаченным для будущих счетов-фактур по заказам, которые еще не оплачены. Я предпочитаю, чтобы данные для элемента были в таблице заказов. На самом деле это не дублирующая информация (это информация на момент продажи), поэтому она не денормализуется больше, чем два заказа с той же датой не будут дублировать данные. – HLGEM

Смежные вопросы