Проект моделирования данных / цитата / заказ / счет - PullRequest
9 голосов
/ 17 апреля 2011

В настоящее время я работаю над небольшим проектом, в котором мне нужно смоделировать следующий сценарий:

Сценарий

  1. Клиент звонит, ему нужна цитата нановый автомобиль.
  2. Торговый представитель.зарегистрировать информацию о клиенте.
  3. Торговый представитель.создайте цитату в системе и добавьте элемент в цитату (автомобиль).
  4. Торговый представитель.отправьте предложение клиенту по электронной почте.
  5. Клиент принимает предложение, и предложение больше не является предложением, а заказом.
  6. Торговый представитель.проверьте заказ, все в порядке, и он выставляет счет на заказ.Заказ теперь уже не заказ, а счет.

Мысли

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

  1. Я думаю, что оба черновик / цитата / счет-фактура в основном заказ.
  2. Черновик / цитата / счет-фактура должны отделить уникальные номера (идентификаторы) тактам я думаю, отдельные таблицы для всех из них.

Модель

Это моя модель данных v.1.0, пожалуйста, дайте мне знать, что выдумаю.

Data model v.1.0 Проблемы

У меня, однако, есть сомнения относительно этой модели:

  1. Черновик / цитата / счет-фактура могут отличатьсяпредметы и цены на линии заказа.В этой модели все черновик / квитанция / накладная связаны с одним и тем же заказом, а также строками заказа, что делает невозможным использование отдельных строк цитаты / черновиков / строк накладной.Может быть, я сделаю новые таблицы для этого, но тогда в основном одна и та же информация будет храниться в нескольких таблицах, и это тоже не хорошо.
  2. Иногда две или более кавычки становятся счетом, как эта модель будет заботитьсяоб этом?

Если у вас есть какие-либо советы о том, как смоделировать это лучше, пожалуйста, дайте мне знать!

РЕДАКТИРОВАТЬ: Модель данных v.1.4 enter image description here

Ответы [ 2 ]

6 голосов
/ 17 апреля 2011

Похоже, что вы смоделировали каждую из этих вещей - цитату, заказ, черновик, счет - как структурно идентичные всем остальным. Если это так, то вы можете «поместить» все подобные атрибуты в одну таблицу.

create table statement (
    stmt_id integer primary key,
    stmt_type char(1) not null check (stmt_type in ('d', 'q', 'o', 'i')),
    stmt_date date not null default current_date,
    customer_id integer not null  -- references customer (customer_id)
);

create table statement_line_items (
    stmt_id integer not null references statement (stmt_id),
    line_item_number integer not null,
    -- other columns for line items
    primary key (stmt_id, line_item_number)
);

Я думаю, что это сработает для модели, которую вы описали, но я думаю, что в долгосрочной перспективе вы будете лучше обслуживаться, если будете моделировать их как супертип / подтип. Столбцы, общие для всех подтипов, помещаются «вверх» в супертип; каждый подтип имеет отдельную таблицу для атрибутов, уникальных для этого подтипа.

Этот вопрос SO и его принятый ответ (и комментарии) иллюстрируют дизайн супертипа / подтипа для комментариев блога. Другой вопрос относится к отдельным лицам и организациям. Еще один , касающийся персонала и телефонных номеров.

Позже. , .

Это не завершено, но у меня нет времени. Я знаю, что это не включает позиции. Возможно, пропустил что-то еще.

-- "Supertype". Comments appear above the column they apply to.
create table statement (
  -- Autoincrement or serial is ok here.
  stmt_id integer primary key,    
  stmt_type char(1) unique check (stmt_type in ('d','q','o','i')),
  -- Guarantees that only the order_st table can reference rows having
  -- stmt_type = 'o', only the invoice_st table can reference rows having
  -- stmt_type = 'i', etc.
  unique (stmt_id, stmt_type),
  stmt_date date not null default current_date,
  cust_id integer not null -- references customers (cust_id)
);

-- order "subtype"
create table order_st (
  stmt_id integer primary key,
  stmt_type char(1) not null default 'o' check (stmt_type = 'o'),
  -- Guarantees that this row references a row having stmt_type = 'o'
  -- in the table "statement".
  unique (stmt_id, stmt_type),
  -- Don't cascade deletes. Don't even allow deletes. Every order given
  -- an order number must be maintained for accountability, if not for
  -- accounting. 
  foreign key (stmt_id, stmt_type) references statement (stmt_id, stmt_type) 
    on delete restrict,
  -- Autoincrement or serial is *not* ok here, because they can have gaps. 
  -- Database must account for each order number.
  order_num integer not null,  
  is_canceled boolean not null 
    default FALSE
);

-- Write triggers, rules, whatever to make this view updatable.
-- You build one view per subtype, joining the supertype and the subtype.
-- Application code uses the updatable views, not the base tables.    
create view orders as 
select t1.stmt_id, t1.stmt_type, t1.stmt_date, t1.cust_id,
       t2.order_num, t2.is_canceled
from statement t1
inner join order_st t2 on (t1.stmt_id = t2.stmt_id);
6 голосов
/ 17 апреля 2011

Должна быть таблица «quotelines», которая была бы похожа на «orderlines». Точно так же у вас должна быть таблица invoicelines. Все эти таблицы должны иметь поле «цена» (которое номинально будет ценой детали по умолчанию) вместе с полем «скидка». Вы также можете добавить поле «скидка» в таблицы «котировки», «заказы» и «счета-фактуры» для обработки таких вещей, как скидки за наличные или специальные предложения. Несмотря на то, что вы пишете, хорошо * иметь 1002 * хорошо иметь отдельные таблицы, так как сумма и цена в предложении могут не соответствовать тому, что заказывает клиент, и опять же, это может быть не та сумма, которую вы фактически предоставляете.

Я не уверен, что такое таблица «черновик» - вы, вероятно, могли бы объединить таблицы «черновик» и «счета», так как они содержат одну и ту же информацию, с одним полем, содержащим статус счета - черновик или окончательный вариант. Важно отделить данные счета-фактуры от данных заказа, так как предположительно вы будете платить налоги в соответствии с вашим доходом (счетами).

«Котировки», «Заказы» и «Счета-фактуры» должны иметь поле (внешний ключ), в котором хранится значение торгового представителя; это поле будет указывать на несуществующую таблицу SalesRep. Вы также можете добавить поле «salesrep» в таблицу «customer», которое указывает на представителя по умолчанию для клиента. Это значение будет скопировано в таблицу 'quotes', хотя его можно изменить, если цитата будет отличаться от значения по умолчанию, отличного от значения по умолчанию. Аналогично, это поле должно быть скопировано, когда заказ сделан из предложения, а счет - из заказа.

Я мог бы добавить гораздо больше, но все зависит от того, насколько сложную и детальную систему вы хотите создать. Возможно, вам придется добавить некоторую форму «ведомости материалов», если автомобили настроены в соответствии с их параметрами и имеют соответствующую цену.

...