Дизайн базы данных: пополнение счета и транзакции - PullRequest
1 голос
/ 13 ноября 2010

Мы находимся в бизнесе генерации лидов.Клиенты получают от нас информацию.Они просматривают основную информацию о лидерстве и решают, принять ли инициативу или отклонить.Если они принимают лидерство, им вычитается 1 кредит (за каждое лидерство), и они могут просматривать подробную информацию о лидерстве.

Таким образом, каждое лидерство стоит 1 кредит (который привязан к некоторой денежной стоимости).

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

Клиенты могут получать предоплату или постоплату.

У меня есть следующие таблицы для всего вышеперечисленного:

Customers (id, name, address, is_postpaid, customer_type_id)
CustomerTypes (id, name, credit_price) // name: insurance agent, real estate agent, etc
TransactionTypes (id, name) // add to or deduct from credit balance
CustomerTransactions (id, customer_id, quantity, transaction_type_id, credit_balance, credit_unit_price, date_created)

Вопросы:

  • Что вы думаете об общем подходе?
  • Этот дизайн подходит для клиентов с предоплатой.А как насчет постоплаты?

Любые отзывы и критика приветствуются.

Обновление: : я обновил таблицы выше, чтобы включить FK в таблицу Customers.

Ответы [ 4 ]

3 голосов
/ 13 ноября 2010

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

Баланс клиента всегда можно получить:

select
      CustomerName
    , sum(Credits) - sum(Debits) as AccountBalance
from Transactions as t
join Customer     as c  on c.CustomerId = t.CustomerId
group by CustomerName
order by CustomerName ;
0 голосов
/ 13 ноября 2010

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

У вас должна быть одна таблица для записи использования кредита (т. Е. CustomerCreditUsage) и другая таблица для покупок кредита (CustomerTransactions).После покупки вы проверяете наличие отрицательного кредитного баланса и закрываете записи из таблицы использования кредитов.При предоплате при регистрации транзакции использования кредита вычитается из кредитного баланса самой старой кредитной покупки.

Имейте в виду, что между покупками в кредит и использованием кредита существует слабая связь.Вы можете иметь одно без другого.Несмотря на то, что вы не хотите использовать кредит без соответствующей покупки в кредит слишком долго (постоплата).

0 голосов
/ 13 ноября 2010

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

Чтобы учесть различия до публикации, вы можете ввести новую таблицу, которая описывает это:

    customer_type
    --------------
    id    
    pre_or_post
    begin_date
    end_date
0 голосов
/ 13 ноября 2010

Я бы изменил базу данных следующим образом:

Клиенты (идентификатор, имя, customerType_id, адрес, is_postpaid)
CustomerTypes (id, name, credit_price)
CustomerTransactions (id, customer_id, количество, тип транзакции, credit_balance, credit_unit_price, date_created)

В чем я не уверен, так это в концепции предоплаты или постоплаты. Не могли бы вы уточнить это для меня.

...