Обратная связь по дизайну базы данных - PullRequest
0 голосов
/ 21 июня 2011

Счет может содержать 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 

Если сумма минус (например, -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 выполнено) или какой может быть лучший статус?

Таблица выплат

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 |
+-----------+-----------+--------+---------------------+-------------+

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

Спасибо.

Ответы [ 4 ]

3 голосов
/ 21 июня 2011

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

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

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

2 голосов
/ 21 июня 2011

Хорошо выглядит.

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

0 голосов
/ 21 июня 2011

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

Обязательно сохраните декодеры «Статус счета-фактуры» и «Тип платежа» в справочной таблице, чтобы их можно было применить в базе данных и не иметьполагаться на программистов, кодирующих его правильно.

0 голосов
/ 21 июня 2011

Мне кажется, это то, что я бы тоже сделал.

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

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

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