Invoice & Invoice lines: Как вы храните информацию об адресе клиента? - PullRequest
4 голосов
/ 02 июня 2010

Привет, я разрабатываю приложение для выставления счетов.

Таким образом, общая идея состоит в том, чтобы иметь две таблицы:

Invoice (ID, Date, CustomerAddress, CustomerState, CustomerCountry, VAT, Total);

InvoiceLine (Invoice_ID, ID, Concept, Units, PricePerUnit, Total); 

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

Таким образом, альтернатива состоит в том, чтобы иметь таблицу адресов, а затем создать отношение Address <-Invoice. </p>

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

Итак, каков ваш опыт?

Как адрес клиента хранится в счете? В таблице счетов? адресную таблицу? или что-то еще?

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

Ответы [ 3 ]

8 голосов
/ 02 июня 2010

Я бы настоятельно рекомендовал не хранить никаких данных о клиенте, таких как в счете.

Вместо этого у меня будет такая структура:

Таблица клиентов с первичным ключом id

Таблица адресов клиентов (поскольку каждый клиент может иметь разные адреса с течением времени) с идентификатором клиента в качестве внешнего ключа

Таблица счетов с полем адреса, который является внешним ключом таблицы адресов клиента.

Кстати, я бы рассмотрел добавление поля НДС для каждой позиции. В некоторых странах существуют разные ставки НДС для разных типов товаров.

1 голос
/ 02 июня 2010

Большинство стандартных баз данных о продуктах / заказах будут иметь

a products table (ProductId, product info fields)  
a customers table (CustomerID, customer info like address etc) 
and an orders table  (OrderNumber, CustomerID, date, etc)

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

orderItems (OrderNumber, ProductID, quantity, purchasePrice, vat, etc)

Чтобы получить полный счет-фактуру, нужно запросить таблицу заказов и объединить ее с таблицей OrderItems. Элемент OrderItem обычно имеет покупную цену и т. Д., Поскольку цена в таблице продуктов может измениться после создания заказа, и эта информация часто полезна для хранения.

0 голосов
/ 06 августа 2014

Я бы подумал сделать это с тремя таблицами: Customer, Invoice и Address, но сконструировать его так, чтобы после ввода адреса он никогда не обновлялся и не удалялся, а только устарел. Вы можете иметь логическое поле IsDeprecated или IsActive в вашей адресной таблице. Затем, когда вы создаете счет-фактуру, счет-фактура связывается с CustomerID И с AddressID, используемым в то время. Когда клиент меняет свой адрес, вы создаете новую запись с новым AddressID и исключаете старую с логическим полем. Или, если вы действительно хотите вести хорошие записи и / или когда-нибудь захотите просмотреть эти данные, у вас могут быть AddressActiveStartDate и AddressActiveEndDate, но это сделает запросы немного более сложными.

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

При необходимости вы можете добавить больше таблиц, например, Product, InvoiceLine, State и т. Д.

...